mirror of
https://github.com/tadfisher/gradle2nix.git
synced 2026-01-11 15:30:38 -05:00
gradle-env.nix: Use dependencyResolutionManagement in 6.8+
This commit is contained in:
@@ -29,7 +29,7 @@ application {
|
|||||||
applicationName = "gradle2nix"
|
applicationName = "gradle2nix"
|
||||||
applicationDefaultJvmArgs += "-Dorg.nixos.gradle2nix.share=@APP_HOME@/share"
|
applicationDefaultJvmArgs += "-Dorg.nixos.gradle2nix.share=@APP_HOME@/share"
|
||||||
applicationDistribution
|
applicationDistribution
|
||||||
.from(tasks.getByPath(":plugin:shadowJar"))
|
.from(tasks.getByPath(":plugin:shadowJar"), "$rootDir/gradle-env.nix")
|
||||||
.into("share")
|
.into("share")
|
||||||
.rename("plugin.*\\.jar", "plugin.jar")
|
.rename("plugin.*\\.jar", "plugin.jar")
|
||||||
}
|
}
|
||||||
|
|||||||
331
app/src/dist/share/gradle-env.nix
vendored
331
app/src/dist/share/gradle-env.nix
vendored
@@ -1,331 +0,0 @@
|
|||||||
# This file is generated by gradle2nix.
|
|
||||||
#
|
|
||||||
# Example usage (e.g. in default.nix):
|
|
||||||
#
|
|
||||||
# with (import <nixpkgs> {});
|
|
||||||
# let
|
|
||||||
# buildGradle = callPackage ./gradle-env.nix {};
|
|
||||||
# in
|
|
||||||
# buildGradle {
|
|
||||||
# envSpec = ./gradle-env.json;
|
|
||||||
#
|
|
||||||
# src = ./.;
|
|
||||||
#
|
|
||||||
# gradleFlags = [ "installDist" ];
|
|
||||||
#
|
|
||||||
# installPhase = ''
|
|
||||||
# mkdir -p $out
|
|
||||||
# cp -r app/build/install/myproject $out
|
|
||||||
# '';
|
|
||||||
# }
|
|
||||||
|
|
||||||
{ stdenv, buildEnv, fetchurl, gradleGen, writeText, writeTextDir }:
|
|
||||||
|
|
||||||
{
|
|
||||||
# Path to the environment spec generated by gradle2nix (e.g. gradle-env.json).
|
|
||||||
envSpec
|
|
||||||
, pname ? null
|
|
||||||
, version ? null
|
|
||||||
, enableParallelBuilding ? true
|
|
||||||
# Arguments to Gradle used to build the project in buildPhase.
|
|
||||||
, gradleFlags ? [ "build" ]
|
|
||||||
# Gradle package to use instead of the one generated by gradle2nix.
|
|
||||||
, gradlePackage ? null
|
|
||||||
# Enable debugging for the Gradle build; this will cause Gradle to run a debug server
|
|
||||||
# and wait for a JVM debugging client to attach.
|
|
||||||
, enableDebug ? false
|
|
||||||
# Additional code to run in the Gradle init script (init.gradle).
|
|
||||||
, extraInit ? ""
|
|
||||||
# Override the default JDK used to run Gradle itself.
|
|
||||||
, buildJdk ? null
|
|
||||||
, ... } @ args:
|
|
||||||
|
|
||||||
let
|
|
||||||
inherit (builtins)
|
|
||||||
attrValues concatStringsSep filter fromJSON match replaceStrings sort;
|
|
||||||
|
|
||||||
inherit (stdenv.lib)
|
|
||||||
assertMsg concatMapStringsSep groupBy' hasSuffix last mapAttrs
|
|
||||||
mapAttrsToList optionalString readFile removeSuffix unique versionAtLeast
|
|
||||||
versionOlder;
|
|
||||||
|
|
||||||
mkDep = depSpec: stdenv.mkDerivation {
|
|
||||||
inherit (depSpec) name;
|
|
||||||
|
|
||||||
src = fetchurl {
|
|
||||||
inherit (depSpec) urls sha256;
|
|
||||||
};
|
|
||||||
|
|
||||||
phases = "installPhase";
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/${depSpec.path}
|
|
||||||
ln -s $src $out/${depSpec.path}/${depSpec.name}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
mkModuleMetadata = deps:
|
|
||||||
let
|
|
||||||
ids = filter
|
|
||||||
(id: id.type == "pom")
|
|
||||||
(map (dep: dep.id) deps);
|
|
||||||
|
|
||||||
modules = groupBy'
|
|
||||||
(meta: id:
|
|
||||||
let
|
|
||||||
isNewer = versionOlder meta.latest id.version;
|
|
||||||
isNewerRelease =
|
|
||||||
!(hasSuffix "-SNAPSHOT" id.version) &&
|
|
||||||
versionOlder meta.release id.version;
|
|
||||||
in {
|
|
||||||
groupId = id.group;
|
|
||||||
artifactId = id.name;
|
|
||||||
latest = if isNewer then id.version else meta.latest;
|
|
||||||
release = if isNewerRelease then id.version else meta.release;
|
|
||||||
versions = meta.versions ++ [id.version];
|
|
||||||
}
|
|
||||||
)
|
|
||||||
{
|
|
||||||
latest = "";
|
|
||||||
release = "";
|
|
||||||
versions = [];
|
|
||||||
}
|
|
||||||
(id: "${replaceStrings ["."] ["/"] id.group}/${id.name}/maven-metadata.xml")
|
|
||||||
ids;
|
|
||||||
|
|
||||||
in
|
|
||||||
attrValues (mapAttrs (path: meta:
|
|
||||||
let
|
|
||||||
versions' = sort versionOlder (unique meta.versions);
|
|
||||||
in
|
|
||||||
with meta; writeTextDir path ''
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<metadata modelVersion="1.1">
|
|
||||||
<groupId>${groupId}</groupId>
|
|
||||||
<artifactId>${artifactId}</artifactId>
|
|
||||||
<versioning>
|
|
||||||
${optionalString (latest != "") "<latest>${latest}</latest>"}
|
|
||||||
${optionalString (release != "") "<release>${release}</release>"}
|
|
||||||
<versions>
|
|
||||||
${concatMapStringsSep "\n " (v: "<version>${v}</version>") versions'}
|
|
||||||
</versions>
|
|
||||||
</versioning>
|
|
||||||
</metadata>
|
|
||||||
''
|
|
||||||
) modules);
|
|
||||||
|
|
||||||
mkSnapshotMetadata = deps:
|
|
||||||
let
|
|
||||||
snapshotDeps = filter (dep: dep ? build && dep ? timestamp) deps;
|
|
||||||
|
|
||||||
modules = groupBy'
|
|
||||||
(meta: dep:
|
|
||||||
let
|
|
||||||
id = dep.id;
|
|
||||||
isNewer = dep.build > meta.buildNumber;
|
|
||||||
# Timestamp values can be bogus, e.g. jitpack.io
|
|
||||||
updated = if (match "[0-9]{8}\.[0-9]{6}" dep.timestamp) != null
|
|
||||||
then replaceStrings ["."] [""] dep.timestamp
|
|
||||||
else "";
|
|
||||||
in {
|
|
||||||
groupId = id.group;
|
|
||||||
artifactId = id.name;
|
|
||||||
version = id.version;
|
|
||||||
timestamp = if isNewer then dep.timestamp else meta.timestamp;
|
|
||||||
buildNumber = if isNewer then dep.build else meta.buildNumber;
|
|
||||||
lastUpdated = if isNewer then updated else meta.lastUpdated;
|
|
||||||
versions = meta.versions or [] ++ [{
|
|
||||||
classifier = id.classifier or "";
|
|
||||||
extension = id.extension;
|
|
||||||
value = "${removeSuffix "-SNAPSHOT" id.version}-${dep.timestamp}-${toString dep.build}";
|
|
||||||
updated = updated;
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
)
|
|
||||||
{
|
|
||||||
timestamp = "";
|
|
||||||
buildNumber = -1;
|
|
||||||
lastUpdated = "";
|
|
||||||
}
|
|
||||||
(dep: "${replaceStrings ["."] ["/"] dep.id.group}/${dep.id.name}/${dep.id.version}/maven-metadata.xml")
|
|
||||||
snapshotDeps;
|
|
||||||
|
|
||||||
mkSnapshotVersion = version: ''
|
|
||||||
<snapshotVersion>
|
|
||||||
${optionalString (version.classifier != "") "<classifier>${version.classifier}</classifier>"}
|
|
||||||
<extension>${version.extension}</extension>
|
|
||||||
<value>${version.value}</value>
|
|
||||||
${optionalString (version.updated != "") "<updated>${version.updated}</updated>"}
|
|
||||||
</snapshotVersion>
|
|
||||||
'';
|
|
||||||
|
|
||||||
in
|
|
||||||
attrValues (mapAttrs (path: meta:
|
|
||||||
with meta; writeTextDir path ''
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<metadata modelVersion="1.1">
|
|
||||||
<groupId>${groupId}</groupId>
|
|
||||||
<artifactId>${artifactId}</artifactId>
|
|
||||||
<version>${version}</version>
|
|
||||||
<versioning>
|
|
||||||
<snapshot>
|
|
||||||
${optionalString (timestamp != "") "<timestamp>${timestamp}</timestamp>"}
|
|
||||||
${optionalString (buildNumber != -1) "<buildNumber>${toString buildNumber}</buildNumber>"}
|
|
||||||
</snapshot>
|
|
||||||
${optionalString (lastUpdated != "") "<lastUpdated>${lastUpdated}</lastUpdated>"}
|
|
||||||
<snapshotVersions>
|
|
||||||
${concatMapStringsSep "\n " mkSnapshotVersion versions}
|
|
||||||
</snapshotVersions>
|
|
||||||
</versioning>
|
|
||||||
</metadata>
|
|
||||||
''
|
|
||||||
) modules);
|
|
||||||
|
|
||||||
mkRepo = project: type: deps: buildEnv {
|
|
||||||
name = "${project}-gradle-${type}-env";
|
|
||||||
paths = map mkDep deps ++ mkModuleMetadata deps ++ mkSnapshotMetadata deps;
|
|
||||||
};
|
|
||||||
|
|
||||||
mkInitScript = projectSpec: gradle:
|
|
||||||
let
|
|
||||||
repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies;
|
|
||||||
hasDependencies = mapAttrs (type: deps: deps != []) projectSpec.dependencies;
|
|
||||||
in
|
|
||||||
assert (assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") ''
|
|
||||||
Project `${projectSpec.name}' has settings script dependencies, such as settings
|
|
||||||
plugins, which are not supported by gradle2nix for Gradle versions prior to 6.0.
|
|
||||||
|
|
||||||
Potential remedies:
|
|
||||||
- Pass `--gradle-version=<version>' to the gradle2nix command.
|
|
||||||
- Patch the `settings.gradle[.kts]' file to remove script dependencies.
|
|
||||||
'');
|
|
||||||
|
|
||||||
writeText "init.gradle" ''
|
|
||||||
static def offlineRepo(RepositoryHandler repositories, String env, String path) {
|
|
||||||
repositories.clear()
|
|
||||||
repositories.maven {
|
|
||||||
name "Nix''${env.capitalize()}MavenOffline"
|
|
||||||
url path
|
|
||||||
metadataSources {
|
|
||||||
it.gradleMetadata()
|
|
||||||
it.mavenPom()
|
|
||||||
it.artifact()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
repositories.ivy {
|
|
||||||
name "Nix''${env.capitalize()}IvyOffline"
|
|
||||||
url path
|
|
||||||
layout "maven"
|
|
||||||
metadataSources {
|
|
||||||
it.gradleMetadata()
|
|
||||||
it.ivyDescriptor()
|
|
||||||
it.artifact()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
${optionalString (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) ''
|
|
||||||
gradle.beforeSettings {
|
|
||||||
offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}")
|
|
||||||
}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (hasDependencies.plugin) ''
|
|
||||||
gradle.settingsEvaluated {
|
|
||||||
offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}")
|
|
||||||
}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (hasDependencies.buildscript) ''
|
|
||||||
gradle.projectsLoaded {
|
|
||||||
allprojects {
|
|
||||||
buildscript {
|
|
||||||
offlineRepo(repositories, "buildscript", "${repos.buildscript}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (hasDependencies.project) ''
|
|
||||||
gradle.projectsLoaded {
|
|
||||||
allprojects {
|
|
||||||
offlineRepo(repositories, "project", "${repos.project}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${extraInit}
|
|
||||||
'';
|
|
||||||
|
|
||||||
mkGradle = gradleSpec:
|
|
||||||
gradleGen.gradleGen {
|
|
||||||
inherit (gradleSpec) nativeVersion;
|
|
||||||
|
|
||||||
name = "gradle-${gradleSpec.version}-${gradleSpec.type}";
|
|
||||||
|
|
||||||
src = fetchurl {
|
|
||||||
inherit (gradleSpec) url sha256;
|
|
||||||
};
|
|
||||||
} // {
|
|
||||||
inherit (gradleSpec) version;
|
|
||||||
};
|
|
||||||
|
|
||||||
mkProjectEnv = projectSpec: rec {
|
|
||||||
inherit (projectSpec) name path version;
|
|
||||||
gradle = args.gradlePackage or mkGradle projectSpec.gradle;
|
|
||||||
initScript = mkInitScript projectSpec gradle;
|
|
||||||
};
|
|
||||||
|
|
||||||
gradleEnv = mapAttrs
|
|
||||||
(_: p: mkProjectEnv p)
|
|
||||||
(fromJSON (readFile envSpec));
|
|
||||||
|
|
||||||
projectEnv = gradleEnv."";
|
|
||||||
pname = args.pname or projectEnv.name;
|
|
||||||
version = args.version or projectEnv.version;
|
|
||||||
|
|
||||||
buildProject = env: flags: ''
|
|
||||||
gradle --offline --no-daemon --no-build-cache \
|
|
||||||
--info --full-stacktrace --warning-mode=all \
|
|
||||||
${optionalString enableParallelBuilding "--parallel"} \
|
|
||||||
${optionalString enableDebug "-Dorg.gradle.debug=true"} \
|
|
||||||
${optionalString (buildJdk != null) "-Dorg.gradle.java.home=${buildJdk.home}"} \
|
|
||||||
--init-script ${env.initScript} \
|
|
||||||
${optionalString (env.path != "") ''-p "${env.path}"''} \
|
|
||||||
${concatStringsSep " " flags}
|
|
||||||
'';
|
|
||||||
|
|
||||||
buildIncludedProjects =
|
|
||||||
concatStringsSep "\n" (mapAttrsToList
|
|
||||||
(_: env: buildProject env [ "build" ])
|
|
||||||
(removeAttrs gradleEnv [ "" ]));
|
|
||||||
|
|
||||||
buildRootProject = buildProject projectEnv gradleFlags;
|
|
||||||
|
|
||||||
in stdenv.mkDerivation (args // {
|
|
||||||
|
|
||||||
inherit pname version;
|
|
||||||
|
|
||||||
nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ projectEnv.gradle ];
|
|
||||||
|
|
||||||
buildPhase = args.buildPhase or ''
|
|
||||||
runHook preBuild
|
|
||||||
|
|
||||||
(
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
# use the init script here
|
|
||||||
TMPHOME=$(mktemp -d)
|
|
||||||
mkdir -p $TMPHOME/init.d
|
|
||||||
cp ${projectEnv.initScript} $TMPHOME/init.d
|
|
||||||
|
|
||||||
export "GRADLE_USER_HOME=$TMPHOME"
|
|
||||||
${buildIncludedProjects}
|
|
||||||
${buildRootProject}
|
|
||||||
)
|
|
||||||
|
|
||||||
runHook postBuild
|
|
||||||
'';
|
|
||||||
|
|
||||||
dontStrip = true;
|
|
||||||
})
|
|
||||||
@@ -190,6 +190,19 @@ let
|
|||||||
let
|
let
|
||||||
repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies;
|
repos = mapAttrs (mkRepo projectSpec.name) projectSpec.dependencies;
|
||||||
hasDependencies = mapAttrs (type: deps: deps != []) projectSpec.dependencies;
|
hasDependencies = mapAttrs (type: deps: deps != []) projectSpec.dependencies;
|
||||||
|
|
||||||
|
inSettings = pred: script:
|
||||||
|
optionalString pred (
|
||||||
|
if versionAtLeast gradle.version "6.0" then ''
|
||||||
|
gradle.beforeSettings {
|
||||||
|
${script}
|
||||||
|
}
|
||||||
|
'' else ''
|
||||||
|
gradle.settingsEvaluated {
|
||||||
|
${script}
|
||||||
|
}
|
||||||
|
''
|
||||||
|
);
|
||||||
in
|
in
|
||||||
assert (assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") ''
|
assert (assertMsg (hasDependencies.settings -> versionAtLeast gradle.version "6.0") ''
|
||||||
Project `${projectSpec.name}' has settings script dependencies, such as settings
|
Project `${projectSpec.name}' has settings script dependencies, such as settings
|
||||||
@@ -224,16 +237,12 @@ let
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
${optionalString (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) ''
|
${inSettings (hasDependencies.settings && (versionAtLeast gradle.version "6.0")) ''
|
||||||
gradle.beforeSettings {
|
offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}")
|
||||||
offlineRepo(it.buildscript.repositories, "settings", "${repos.settings}")
|
|
||||||
}
|
|
||||||
''}
|
''}
|
||||||
|
|
||||||
${optionalString (hasDependencies.plugin) ''
|
${inSettings (hasDependencies.plugin) ''
|
||||||
gradle.settingsEvaluated {
|
offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}")
|
||||||
offlineRepo(it.pluginManagement.repositories, "plugin", "${repos.plugin}")
|
|
||||||
}
|
|
||||||
''}
|
''}
|
||||||
|
|
||||||
${optionalString (hasDependencies.buildscript) ''
|
${optionalString (hasDependencies.buildscript) ''
|
||||||
@@ -246,13 +255,24 @@ let
|
|||||||
}
|
}
|
||||||
''}
|
''}
|
||||||
|
|
||||||
${optionalString (hasDependencies.project) ''
|
${optionalString (hasDependencies.project) (
|
||||||
gradle.projectsLoaded {
|
if versionAtLeast gradle.version "6.8"
|
||||||
allprojects {
|
then ''
|
||||||
offlineRepo(repositories, "project", "${repos.project}")
|
gradle.beforeSettings {
|
||||||
}
|
it.dependencyResolutionManagement {
|
||||||
}
|
offlineRepo(repositories, "project", "${repos.project}")
|
||||||
''}
|
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
''
|
||||||
|
else ''
|
||||||
|
gradle.projectsLoaded {
|
||||||
|
allprojects {
|
||||||
|
offlineRepo(repositories, "project", "${repos.project}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
''
|
||||||
|
)}
|
||||||
|
|
||||||
${extraInit}
|
${extraInit}
|
||||||
'';
|
'';
|
||||||
@@ -285,6 +305,8 @@ let
|
|||||||
version = args.version or projectEnv.version;
|
version = args.version or projectEnv.version;
|
||||||
|
|
||||||
buildProject = env: flags: ''
|
buildProject = env: flags: ''
|
||||||
|
cp ${env.initScript} "$GRADLE_USER_HOME/init.d"
|
||||||
|
|
||||||
gradle --offline --no-daemon --no-build-cache \
|
gradle --offline --no-daemon --no-build-cache \
|
||||||
--info --full-stacktrace --warning-mode=all \
|
--info --full-stacktrace --warning-mode=all \
|
||||||
${optionalString enableParallelBuilding "--parallel"} \
|
${optionalString enableParallelBuilding "--parallel"} \
|
||||||
@@ -314,12 +336,11 @@ in stdenv.mkDerivation (args // {
|
|||||||
(
|
(
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
# use the init script here
|
# Work around https://github.com/gradle/gradle/issues/1055
|
||||||
TMPHOME=$(mktemp -d)
|
TMPHOME="$(mktemp -d)"
|
||||||
mkdir -p $TMPHOME/init.d
|
mkdir -p "$TMPHOME/init.d"
|
||||||
cp ${projectEnv.initScript} $TMPHOME/init.d
|
export GRADLE_USER_HOME="$TMPHOME"
|
||||||
|
|
||||||
export "GRADLE_USER_HOME=$TMPHOME"
|
|
||||||
${buildIncludedProjects}
|
${buildIncludedProjects}
|
||||||
${buildRootProject}
|
${buildRootProject}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user