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?
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)
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
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.
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/"
}
}
}
}