如何使用dev / prod配置覆盖gradle构建

时间:2016-03-29 08:21:14

标签: java gradle

我正在评估gradle替换ant构建脚本,我无法找到创建正确管理 dev / prod 的标准构建脚本的解决方案环境。

比ant脚本(它是一个java项目,而不是android)以这种方式构建:

  1. 带有标准任务的常见脚本(compile,build-jar,build-war)
  2. 一个特定的项目脚本,包含第一个脚本,并通过一些属性定义war任务应该选择正确文件的位置
  3. 我们的项目结构/ taks允许在最后的战争中覆盖整个目录。让我们考虑这个例子: dev 配置是标准配置,并将dir webcontent放在int中 在prod目录下有多个 prod conf(每个特定安装中的一个,我们没有更多10个不同的prod配置)(即* prod / conf1 * m prod / conf2 < / em>等)

    ant build有dev_build任务作为prod_conf1_build,prod_conf2_build,等等 XXX_build任务执行相同的操作:

    1. 指定包含env dir / files
    2. 的父级(它是项目属性)dir
    3. 使用调用任务
    4. 中指定的属性调用构建战争的相同ant taks

      我试图在gradle中做同样的事情,但似乎即使从另一个调用一个taks也会产生一些问题(即任务始终是最新的)

      这是脚本(这是一个工作草案,我正在学习gradle)试图做同样的事情,但当我打电话给war_prod时,它没有工作,因为它报告最新的,所以没有任何作用

      apply plugin: 'java'
      apply plugin: 'war'
      apply plugin: 'eclipse'
      
      project.ext.envdir = "" 
      
      eclipse {
        jdt {
          sourceCompatibility = 1.8
          targetCompatibility = 1.8
          javaRuntimeName = "jdk-1.8.x" 
        }
      }
      
      
      // In this section you declare where to find the dependencies of your project
      repositories {
          maven {
              url 'http://artifactory.zzzz.priv/artifactory/libs-release'
              url 'http://artifactory.zzzz.priv/artifactory/libs-snapshot'
              credentials {
                  username 'xxxx'
                  password 'yyyy'
              }
          }
      }
      
      // In this section you declare the dependencies for your production and test code
      dependencies {
          // The production code uses the SLF4J logging API at compile time
          compile 'org.slf4j:slf4j-api:1.7.18'
      
          // Declare the dependency for your favourite test framework you want to use in your tests.
          // TestNG is also supported by the Gradle Test task. Just change the
          // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
          // 'test.useTestNG()' to your build script.
          testCompile 'junit:junit:4.12'
      }
      
      task war_prod {
          project.ext.envdir='prod/conf1'
          project.ext.envdir=project.ext.envdir.replaceAll('\\\\',File.pathSeparator)
          project.ext.envdir=project.ext.envdir.replaceAll('/',File.pathSeparator)
          tasks.war.execute()
      }
      
      
      war {
       eachFile {
        println 'endir' + project.ext.envdir
        println 'evaluating' + it
        FileTree tree = fileTree(dir: project.ext.envdir)
        tree.visit  { FileVisitDetails  file->
        if (!file.file.isDirectory()) {
        println '\tFileVisitDetails relpath ' + file.relativePath
        println '\tsourcepath ' + it.file.getAbsolutePath()
        println '\tcontains ' + it.file.getAbsolutePath().contains(project.ext.envdir)
        if (it.relativePath == file.relativePath && !it.file.getAbsolutePath().contains(project.ext.envdir)) {
           it.exclude()
           println '\texcluding ' + it
        } else {
         if (it!=null) {
           //println '\tincluding ' + it
           }
        }
        }
        }
      
       }
      
       from 'prod/conf1'
      }
      

      有人能指出我正确的方向来创建正确的gradle脚本吗? 是否有一种特定的gradle方法来使用prod / dev配置构建war文件(其中配置由一些目录和文件表示)?

1 个答案:

答案 0 :(得分:4)

在这种情况下task rules可能非常有用。基本思想是以结构化方式保持配置,并使用一般任务来构建具有已定义配置的war文件。请查看下面的 build.gradle

apply plugin: 'war'

repositories {
   mavenCentral()
}

tasks.addRule("Pattern: buildWar<ENV>") { String taskName ->
    if (taskName.startsWith('buildWar')) {
        def env = (taskName - 'buildWar').toLowerCase()
        if (env in ['dev', 'prod',]) {
          task(taskName, type: War) {
              println "Configuring env: $env"
              from("src/main/conf/$env") {
                  into("conf")
              }
          }
        } else {
          println "Invalid env: $env, skipping."
        }
    }
}

此处定义的buildWarENV规则非常具有自我描述性。它接受两个环境 dev prod ,并通过从适当的文件夹进行配置来准备war文件。您可以找到演示here。如有疑问,请询问。

P.S。 Gradle的工作模式与ant有点不同,从基础开始。重要的是,从不从其他任务中运行任务。