web-dev-qa-db-fra.com

Comment obtenez-vous le chemin du script en cours dans groovy?

J'écris un script groovy que je veux être contrôlé via un fichier de propriétés stocké dans le même dossier. Cependant, je veux pouvoir appeler ce script de n'importe où. Lorsque j'exécute le script, il recherche toujours le fichier de propriétés en fonction de l'endroit où il est exécuté et non de l'emplacement du script.

Comment puis-je accéder au chemin du fichier de script depuis le script?

61
Dan Woodward

Depuis Groovy 2.3.0, l'annotation @groovy.transform.SourceURI peut être utilisée pour renseigner une variable avec l'URI de l'emplacement du script. Cet URI peut ensuite être utilisé pour obtenir le chemin du script:

import groovy.transform.SourceURI
import Java.nio.file.Path
import Java.nio.file.Paths

@SourceURI
URI sourceUri

Path scriptLocation = Paths.get(sourceUri)
8
M. Justin

Vous avez raison de dire que new File(".").getCanonicalPath() ne fonctionne pas. Cela renvoie le répertoire de travail .

Pour obtenir le répertoire du script

scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent

Pour obtenir le chemin du fichier de script

scriptFile = getClass().protectionDomain.codeSource.location.path
72
seansand

Cela a du sens si vous exécutez le code Groovy en tant que script, sinon l’idée devient un peu déroutante, IMO. La solution de contournement est ici: https://issues.Apache.org/jira/browse/GROOVY-1642

Fondamentalement, cela implique de changer startGroovy.sh pour qu’il transmette l’emplacement du script Groovy en tant que variable d’environnement.

11
Joshua Davis

Pour utilisateur gradle

J'ai le même problème quand je commence à travailler avec Gradle. Je veux compiler mon épargne par compilateur épargne à distance (personnalisé par mon entreprise).

Voici comment j'ai résolu mon problème:

task compileThrift {
doLast {
        def projectLocation = projectDir.getAbsolutePath(); // HERE is what you've been looking for.
        ssh.run {
            session(remotes.compilerServer) {
                // Delete existing thrift file.
                cleanGeneratedFiles()
                new File("$projectLocation/thrift/").eachFile() { f ->
                    def fileName=f.getName()
                    if(f.absolutePath.endsWith(".thrift")){
                        put from: f, into: "$compilerLocation/$fileName"
                    }
                }
                execute "mkdir -p $compilerLocation/gen-Java"
                def compileResult = execute "bash $compilerLocation/genjar $serviceName", logging: 'stdout', pty: true
                assert compileResult.contains('SUCCESSFUL')
                get from: "$compilerLocation/$serviceName" + '.jar', into: "$projectLocation/libs/"
            }
        }
    }
}
0
Liem Le