2016-03-29 65 views
3

我正在評估用於替換ant構建腳本的gradle,並且我無法找到解決方案來創建正確管理的標準構建腳本dev/prod環境。如何使用dev/prod配置覆蓋gradle版本

  1. 與標準任務的共同腳本(編譯,構建-JAR,打造戰)
  2. 比ant腳本(它是一個Java項目,而不是機器人)這樣的結構一個特定的項目腳本,其中包括第一個和通過一些屬性它定義戰爭任務應該選擇正確的文件

我們的項目結構/ taks允許覆蓋最終戰爭中的整個目錄。讓我們考慮這個例子: 的開發配置是標準之一,規定的int DIR web內容 有多個督促配置(每個具體安裝的一個,我們沒有更多的10個不同的督促CONFIGS)下的所有督促目錄(即* PROD/CONF1 * M 督促/ CONF2等)

Ant構建具有dev_build任務爲prod_conf1_build之一,prod_conf2_build一個等 的XXX_build任務做同樣的事情:

  1. 特殊規格Ÿ包含ENV目錄的父(這是一個項目的屬性)目錄/文件
  2. 調用相同螞蟻TAKS是建立使用調用任務

我試圖做的指定屬性的戰爭在gradle中也是如此,但它似乎甚至從另一個調用taks會產生一些問題(即任務始終是最新的)

這是腳本(這是一個工作草稿,我學習gradle)試圖做同樣的事情,但它不工作,當我打電話給war_prod時taks什麼都不做,因爲它報告了到目前爲止

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文件(其中配置由一些dir和文件表示)?

回答

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規則是非常強的自我描述。它接受兩個環境devprod並通過從適當的文件夾進行配置來準備戰爭文件。你可以找到一個演示here。如有疑問,請提問。

P.S. Gradle與螞蟻有着不同的工作模式,從基礎開始。而且重要的是,從來沒有從其他任務中運行任務。

+0

謝謝你,從你的樣本開始,我已經能夠繼續我的測試 – Giovanni