私の環境:Grails v2.1.1
戦争プロセス中に小さなユーティリティ アプリを実行する必要があります。このアプリは、war ファイルに含めたいファイルを生成します。BuildConfig.groovy の grails.war.resources にコードを入れてみましたが、エラーが表示されないか、作成されるはずのファイルが表示されません。
このユーティリティアプリを実行して、その出力が私の戦争になるようにする方法を知っている人はいますか?
これは、端末インスタンス内で実行されるコマンドです。
sencha app build -e production -d $stagingDir/production
grails.war.resources
inを介して実行しようとする私の試みは次のBuildConfig.groovy
とおりです。
grails.war.resources = { stagingDir ->
//calling echo() does nothing. I don't see the comment in the build output
echo(message:'executing grails.war.resources')
def outputDir = new File("${stagingDir.getParentFile().getPath()}/target/ranForReal")
def command = """sencha app build -e testing -d ${outputDir.getPath()}"""
def executionDir = new File("${stagingDir.getParentFile().getPath()}/web-app")
def proc = command.execute(null,executionDir)
proc.waitFor()
//my desperate attempt to see if anything is happening. I'd expect an error here
def x = 1/0
// Obtain status and output
println "return code: ${ proc.exitValue()}"
println "stderr: ${proc.err.text}"
println "stdout: ${proc.in.text}" // *out* from the external program is *in* for groovy
//this for loop does work and does remove servlet jars, so I know this closure is called.
for (name in ['servlet']) {
delete {
fileset dir: "$stagingDir/WEB-INF/lib/",
includes: "$name*.jar"
}
}
}
grails.war.resources
行く方法はありますか?
アップデート
後世のために、以下の回答を使用したやや複雑な例を次に示します。
_Events.groovy
ファイルから
/**
* Generate an optimized version of the sencha app.
*/
eventCreateWarStart = {warName, stagingDir ->
//argsMap contains params from command line, e.g 'war --sencha.env=production'
def senchaEnvironment = argsMap["sencha.env"] ?: 'testing'
//println is the only way I've found to write to the console.
println "running sencha optimizer code for $senchaEnvironment environment..."
ant.exec(outputproperty: "cmdOut", executable:'sencha',
dir:"$stagingDir",failOnError:true){
arg(value:'app')
arg(value:'build')
arg(value:"-e $senchaEnvironment" )
}
println "${ant.project.properties.cmdOut}"
println'completed sencha optimization process.'
}