【问题标题】:How to test custom gradle task against test project directory如何针对测试项目目录测试自定义 gradle 任务
【发布时间】:2015-01-07 21:24:28
【问题描述】:

我有这样的任务自定义 gradle 插件:

@TaskAction
def buildSemanticVersion() {
    int major = project.semanticVersion.major
    int minor = project.semanticVersion.minor
    int patch = "git rev-list HEAD --count".execute().text.toInteger()

    project.setVersion("${major}.${minor}.${patch}")
}

我对其进行了集成测试:

@Test
public void testBuildSemanticVersion() throws Exception {
    // GIVEN
    Project project = ProjectBuilder.builder().withProjectDir(new File("build/tmp/git-repository")).build()
    project.apply plugin: 'com.github.moleksyuk.vcs-semantic-version'
    project.semanticVersion.with { major = 1; minor = 2 }

    // WHEN
    project.tasks.buildSemanticVersion.execute()

    // THEN
    assertThat(project.version, Matchers.equalTo('1.2.3'))
}

但它失败了,因为我在任务中的命令 "git rev-list HEAD --count".execute().text.toInteger() 是针对我的项目目录而不是针对我的测试目录执行的“构建/tmp/git-repository”

是否可以在测试项目目录中执行此任务?

更新:

感谢@Mark Vieira 和@Rene Groeschke。根据他们的建议,我以这种方式修复它:

@TaskAction
def buildSemanticVersion() {
    int major = project.semanticVersion.major
    int minor = project.semanticVersion.minor

    def stdout = new ByteArrayOutputStream()
    def execResult = project.exec({
        commandLine 'git'
        args 'rev-list', 'HEAD', '--count'
        standardOutput = stdout;
    })

    int patch = stdout.toString().toInteger()

    project.setVersion("${major}.${minor}.${patch}")
}

【问题讨论】:

  • 我建议使用 Gradle 的 Project.exec() 而不是 Groovy 机制,它可以让您设置工作目录。

标签: gradle gradle-custom-plugin


【解决方案1】:

groovys "...".execute() 总是使用 java 进程的当前工作目录,据我所知它是不可配置的。

这个失败的测试已经表明你的任务实现存在问题,因为工作目录不一定是项目目录。您可以使用Exec 任务或将project.exec 方法包装到您自己的任务中。 project.exec 和 Exec 都允许您配置工作目录。

【讨论】:

  • 感谢雷内和马克。你的建议很完美。