如何在`vendor.gradle`供应商设置文件中使用ant.properties?

时间:2016-12-05 15:14:31

标签: gradle ant

我有一个多项目gradle构建,其中包含一个ant构建脚本,其中包含一个如此(简化)的任务:

<target name="get-version">
  <!-- Goes out and fetches the versioning for each project and sets prop -->
  <property name="version" value="${myDesiredVersion}" />
</target>

在我的build.gradle脚本里面我有一个ant脚本加载器然后我依赖这个目标;我的问题是,我的评估方式不允许我在ant.properties['version']中使用我的vendor.gradle

// version = '1.0.2' -- works
version = ant.properties['version'] // doesn't work

我是一个gradle noobie并且最重要的是我正在迁移一个蚂蚁项目以开始使用gradle,所以我可能会偏离正轨。重要的是要注意,我不能直接在vendor.gradle文件中包含该版本,因为它是由ant脚本生成的。

我不熟悉如何在gradle生命周期之前插入这个...我试过这样的事情

gradle.beforeProject { p ->
  tasks['get-version'].execute() // appears to execute successfully?
  configure(p) {
    def vendorSettings = file("${myRoot}/vendor.gradle")
    if(vendorSettings.exists()){
      println "Loading vendor settings for project " + p
      println ant.properties['version'] // but outputs null here
      // ant.properties is still a valid observable map
      apply from: vendorSettings
    }
  }
}

并且ant version属性仍然为null - 请注意它在此之外工作,我认为范围有点不同,我认为它在这种特定情况下

1 个答案:

答案 0 :(得分:1)

你可能有像

这样的东西
task antTask {
  //...

  doLast {
    file("vendor.properties").withInputStream { is ->
      Properties props = new Properties()
      props.load(is)
      props.each { prop -> ext.set(prop.key, prop.value) }
    }
  }
}

执行任务后,您可以访问ext.version等属性

但是,如果要在任务配置中使用属性,这将无法工作,因为所有任务都是先配置的,只有在必要时才执行。因此,只有在已配置所有其他任务后,您的antTask才会运行。因此,您可能需要重新考虑如何生成这些ant属性,并在运行gradle之前预先计算它们,或者将逻辑移植到gradle build。