web-dev-qa-db-fra.com

Gradle: obtenir le chemin du répertoire du projet racine lors du démarrage avec un fichier de construction personnalisé

La structure de mon projet Gradle est la suivante:

Project
├── app
     └── build.gradle
├── foo
     └── bar.txt
·
·
·
└── build.gradle

Normalement, pour obtenir le chemin absolu du dossier foo, je peux simplement faire new File('foo').getAbsolutePath() dans le fichier racine build.gradle.

Mais cela ne fonctionnera malheureusement pas si vous exécutez le script gradle en dehors du répertoire du projet, par exemple en procédant de la manière suivante:

$ trunk/gradlew -b trunk/build.gradle tasks

Avec la commande précédente, gradle recherche le répertoire foo dans le parent du projet, car j’ai lancé le script à partir de là.

Existe-t-il un moyen d'obtenir le chemin absolu du projet où se trouve build.gradle, même si vous démarrez votre script à partir d'un autre répertoire? Ou existe-t-il un autre moyen d'obtenir la référence d'un répertoire dans le même dossier que le script?

J'ai aussi essayé avec getClass().protectionDomain.codeSource.location.path mais il renvoie le chemin d'accès au répertoire de cache de gradle.

18
Roberto Leinardi

new File('foo') par définition (regardez son JavaDoc) crée un chemin relatif au répertoire de travail actuel, cela dépend donc de l'endroit où vous appelez l'application. Si vous voulez un chemin relatif au dossier du projet, utilisez project.file('foo') ou project est la valeur par défaut pour résoudre la méthode simplement file('foo') et vous obtenez le chemin relatif résolu par rapport au répertoire du projet et non au répertoire de travail. Donc, utilisez file('foo').absolutePath et tout ira bien.

18
Vampire

J'ai résolu ce problème en m'assurant que Java userDir était défini sur le répertoire project (i.e. project.projectDir) en haut de mon fichier build.gradle, comme suit:

    System.setProperty( "user.dir", project.projectDir.toString() )
    println  "  project dir:  "+ System.getProperty("user.dir");

Cela peut être vérifié en exécutant un fichier de code séparé (Groovy) tel que:

    println "User Dir: ${System.getProperty( 'user.dir' )}"

Vous pouvez générer les valeurs du projet Gradle avant et après l'utilisation de ces instructions.

    println  "Root project:   ${project.rootProject}";
    println  "  rootDir:      ${project.rootDir}"
    println  "  projectDir:   ${project.projectDir}";
    println  "  project dir:  ${System.getProperty("user.dir")}";

Si vous avez des sous-projets, projectDir n'est pas la même chose que rootDir.

Cela n'a pas corrigé mon problème actuel mais cela m'a permis d'ouvrir le fichier correct (par rapport à l'emplacement de build.gradle.

22
will

Dans le fichier build.gradle, utilisez simplement projectDir pour obtenir le chemin absolu du fichier build.gradle. à partir de là, vous pouvez parcourir les fichiers de votre projet. lisez ceci pour plus d'infos: 

https://www.tutorialspoint.com/gradle/gradle_build_script.htm

1
AliReza19330