Comment obtenir le chemin du script de course à pied dans groovy?

j'écris un script groovy que je veux contrôler 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 je lance le script, il cherche toujours le fichier de propriétés sur la base d'où il est exécuté à partir, non pas du script.

Comment puis-je accéder au chemin d'accès du fichier script depuis l'intérieur du script?

59
demandé sur Noel Yap 2009-07-22 08:39:10

4 réponses

à partir de Groovy 2.3.0 l'annotation @groovy.transform.SourceURI peut être utilisée pour peupler une variable avec L'URI de l'emplacement du script. Cette URI peut ensuite être utilisée pour obtenir le chemin vers le script:

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

@SourceURI
URI sourceUri

Path scriptLocation = Paths.get(sourceUri)
4
répondu M. Justin 2018-09-28 20:38:51

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

pour obtenir le répertoire de script

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

pour obtenir le chemin du fichier de script

scriptFile = getClass().protectionDomain.codeSource.location.path
71
répondu seansand 2017-10-24 12:34:55

cela a du sens si vous utilisez le Groovy code comme un script , sinon toute l'idée devient un peu confuse, IMO. La solution est ici: https://issues.apache.org/jira/browse/GROOVY-1642

fondamentalement, cela implique de changer startGroovy.sh pour passer dans l'emplacement du script Groovy comme variable d'environnement.

11
répondu Joshua Davis 2017-07-01 16:22:21

For grad use

j'ai le même problème quand je commence à travailler avec gradle. Je veux compiler mon thrift par le compilateur de thrift distant (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
répondu Liem Le 2018-01-30 08:05:36