我目前正在模块化我们的gradle构建,以便拥有一个包含许多全局内容的libs / commons.gradle文件。我需要这个,因为并行开发的软件的各个分支,我们希望避免在所有分支之间传播每个脚本文件的变化。
所以我创建了这个lib文件并使用“apply from”来加载它:
申请来自:'gradle / glib / commons.gradle'
在commons.gradle中我定义了svnrevision函数:
...
def svnRevision = {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
SVNClientManager clientManager = SVNClientManager.newInstance(options);
SVNStatusClient statusClient = clientManager.getStatusClient();
SVNStatus status = statusClient.doStatus(projectDir, false);
SVNRevision revision = status.getCommittedRevision();
return revision.getNumber().toString();
}
...
我正在调用包含build.gradle的函数:
...
task writeVersionProperties {
File f = new File(project.webAppDirName+'/WEB-INF/version.properties');
if (f.exists()) { f.delete(); }
f = new File(project.webAppDirName+'/WEB-INF/version.properties');
FileOutputStream os = new FileOutputStream(f);
os.write(("version="+svnRevision()).getBytes());
os.flush();
os.close();
}
...
但我最终进入了:
...
FAILURE: Build failed with an exception.
* Where:
Build $PATH_TO/build20.gradle
* What went wrong:
A problem occurred evaluating root project 'DEV_7.X.X_GRADLEZATION'.
> Could not find method svnRevision() for arguments [] on root project 'DEV_7.X.X_GRADLEZATION'.
...
所以我的问题是:如何在gradle中调用子函数,这是在包含的脚本中定义的?
任何帮助表示赞赏!
答案 0 :(得分:4)
来自http://www.gradle.org/docs/current/userguide/writing_build_scripts.html:
13.4.1。局部变量
使用def关键字声明局部变量。它们只是 在声明它们的范围内可见。局部变量 是底层Groovy语言的一个特性。
13.4.2。额外属性
Gradle域模型中的所有增强对象都可以容纳额外的对象 用户定义的属性。这包括但不限于 项目,任务和源集。可以添加,阅读额外的属性 并通过拥有对象的ext属性设置。或者,分机 block可以用于一次添加多个属性。
如果您将其声明为:
ext.svnRevision = {
...
}
并且不要更改通话,我希望它能够正常工作。