gradle build jarを生成する前にプロファイルを置換

2487 ワード

初めてgradleを使って、少し経験を記録してみました.
質問:
spring bootで開発した新しいプロジェクト、開発環境と生産環境のアプリケーション.propertiesが一致しないため、buildがリリースされるたびにプロファイルを変更する必要があります.
シナリオ:
最初の反応はgoogleでしたが、キーワードを変えたり、適切な案を見つけたりせず、自分で手を出すしかありませんでした.
まずbuildでスクリプトにpropertiesファイルを読み書きする動的置換内容を考慮したが、これは私の審美に合わないので、生産環境の構成を単独でアプリケーションした.properties.realファイル、開発環境のアプリケーション.propertiesファイルはresourceディレクトリの下に並べられています.buildがjarパッケージを打つのは、build/classes/mainとbuild/resources/mainディレクトリを統合してパッケージ化したことが観察され、jarタスクに置換プロファイルの前置きタスクが追加されました.
jar {
    baseName = 'app'
    manifest {
        attributes 'Implementation-Title': 'app', 'Implementation-Version': version
    }

    def app_config="build/resources/main/application.properties"
    def local_config="build/resources/main/application.properties.local"
    def real_config="build/resources/main/application.properties.real"
    doFirst {
        project.file(app_config).renameTo(local_config)
        project.file(real_config).renameTo(app_config)
    }
}

上記は生産環境で構築する場合に適しています.ローカルで構築する場合、ファイルを置き換えた後test casesはプロファイルの問題で通過できないため、jarパッケージが終わった後にプロファイルを戻す必要があります.完全なコードは以下の通りです.
jar {
    baseName = 'app'
    manifest {
        attributes 'Implementation-Title': 'app', 'Implementation-Version': version
    }

    def app_config="build/resources/main/application.properties"
    def local_config="build/resources/main/application.properties.local"
    def real_config="build/resources/main/application.properties.real"
    doFirst {
        project.file(app_config).renameTo(local_config)
        project.file(real_config).renameTo(app_config)
    }
    doLast {
        project.file(app_config).renameTo(real_config)
        project.file(local_config).renameTo(app_config)
    }
}

テストに合格し、提出しました:-D
-----------------------------------------------------------------------------------------------------------------------------------------------------------
追記@2018/04/25
以前はjarを生成するときにファイルを置き換えるのがよくありませんでした.例えば、
def runtimeFolder = "src/runtime_resources"
jar.duplicatesStrategy=DuplicatesStrategy.FAIL
jar.from(runtimeFolder)
def fileList=new ArrayList();
fileTree(runtimeFolder).each { f -> fileList.add(f.name)}
jar.filesMatching(fileList,{ p ->
    if('main'.equals(p.file.parentFile.name)){
        p.exclude()
    }
})