如何读取一个属性文件和使用的价值在项目划分脚本?

我的工作是一个级别脚本,其中我需要读取的 local.properties文件和使用的价值在属性文件中的 build.gradle。我正在以下列方式做这件事。我运行了下面的脚本,它现在抛出了一个错误,但是它也没有做任何类似创建、删除和复制文件的事情。我尝试打印变量的值,它正在显示正确的值。

谁能告诉我这样做是否正确?我认为另一种方法是在 gradle.properties中定义所有内容,并在 build.gradle中使用它。谁能告诉我如何从 build.properties访问 build.gradle中的属性?

build.gradle文件:

apply plugin: 'java'


// Set the group for publishing
group = 'com.true.test'


/**
* Initializing GAVC settings
*/
def buildProperties = new Properties()
file("version.properties").withInputStream {
stream -> buildProperties.load(stream)
}
// If jenkins build, add the jenkins build version to the version. Else add snapshot version to the version.
def env = System.getenv()
if (env["BUILD_NUMBER"]) buildProperties.test+= ".${env["BUILD_NUMBER"]}"
version = buildProperties.test
println "${version}"


// Name is set in the settings.gradle file
group = "com.true.test"
version = buildProperties.test
println "Building ${project.group}:${project.name}:${project.version}"


Properties properties = new Properties()
properties.load(project.file('build.properties').newDataInputStream())
def folderDir = properties.getProperty('build.dir')
def configDir = properties.getProperty('config.dir')
def baseDir  = properties.getProperty('base.dir')
def logDir  = properties.getProperty('log.dir')
def deployDir  = properties.getProperty('deploy.dir')
def testsDir  = properties.getProperty('tests.dir')
def packageDir  = properties.getProperty('package.dir')
def wrapperDir  = properties.getProperty('wrapper.dir')




sourceCompatibility = 1.7
compileJava.options.encoding = 'UTF-8'


repositories {
maven { url "http://arti.oven.c:9000/release" }
}


task swipe(type: Delete) {
println "Delete $projectDir/${folderDir}"
delete "$projectDir/$folderDir"
delete "$projectDir/$logDir"
delete "$projectDir/$deployDir"
delete "$projectDir/$packageDir"
delete "$projectDir/$testsDir"
mkdir("$projectDir/${folderDir}")
mkdir("projectDir/${logDir}")
mkdir("projectDir/${deployDir}")
mkdir("projectDir/${packageDir}")
mkdir("projectDir/${testsDir}")
}
task prepConfigs(type: Copy, overwrite:true, dependsOn: swipe) {
println "The name of ${projectDir}/${folderDir} and ${projectDir}/${configDir}"
from('${projectDir}/${folderDir}')
into('${projectDir}/$configDir}')
include('*.xml')
}

build.properties文件:

# -----------------------------------------------------------------
# General Settings
# -----------------------------------------------------------------
application.name  = Admin
project.name = Hello Cool


# -----------------------------------------------------------------
# ant build directories
# -----------------------------------------------------------------
sandbox.dir = ${projectDir}/../..
reno.root.dir=${sandbox.dir}/Reno
ant.dir = ${projectDir}/ant
build.dir = ${ant.dir}/build
log.dir  = ${ant.dir}/logs
config.dir = ${ant.dir}/configs
deploy.dir  = ${ant.dir}/deploy
static.dir =  ${ant.dir}/static
package.dir = ${ant.dir}/package
tests.dir = ${ant.dir}/tests
tests.logs.dir = ${tests.dir}/logs
external.dir = ${sandbox.dir}/FlexCommon/External
external.lib.dir = ${external.dir}/libs
137023 次浏览

如果使用默认的 gradle.properties文件,您可以直接从 build.gradle文件中访问这些属性:

返回文章页面

applicationName=Admin
projectName=Hello Cool

返回文章页面

task printProps {
doFirst {
println applicationName
println projectName
}
}

如果您需要访问自定义文件,或访问包含 .的属性(看起来您需要这样做) ,您可以在 build.gradle文件中执行以下操作:

def props = new Properties()
file("build.properties").withInputStream { props.load(it) }


task printProps {
doFirst {
println props.getProperty("application.name")
println props.getProperty("project.name")
}
}

请看 格拉德尔文档的这一部分以获得更多信息。

剪辑

如果您想动态地设置其中的一些属性(如下面的注释中提到的) ,可以创建一个 properties.gradle文件(名称并不重要) ,并在 build.gradle脚本中使用它。

返回文章页面

ext {
subPath = "some/sub/directory"
fullPath = "$projectDir/$subPath"
}

build.gradle

apply from: 'properties.gradle'


// prints the full expanded path
println fullPath

我们可以使用一个单独的文件(在我的例子中是 config.groovy)来抽象出所有的配置。

在这个例子中,我们使用了三个环境,即,

  1. 开发计划署
  2. 测试
  3. 电击

它具有 ServerName服务器端口资源的属性。在这里,我们期望第三个属性 资源在多个环境中是相同的。因此,我们抽象出了这个逻辑,并在必要的情况下在特定的环境中重写:

config.groovy

resources {
serverName = 'localhost'
serverPort = '8090'
}


environments {
dev {
serverName = 'http://localhost'
serverPort = '8080'
}


test {
serverName = 'http://www.testserver.com'
serverPort = '5211'
resources {
serverName = 'resources.testserver.com'
}
}


prod {
serverName = 'http://www.productionserver.com'
serverPort = '80'
resources {
serverName = 'resources.productionserver.com'
serverPort = '80'
}
}
}

一旦属性文件准备就绪,我们可以在 build.gradle中使用以下内容来加载这些设置:

build.gradle

loadProperties()


def loadProperties() {
def environment = hasProperty('env') ? env : 'dev'
println "Current Environment: " + environment


def configFile = file('config.groovy')
def config = new ConfigSlurper(environment).parse(configFile.toURL())
project.ext.config = config
}


task printProperties {
println "serverName:  $config.serverName"
println "serverPort:  $config.serverPort"
println "resources.serverName:  $config.resources.serverName"
println "resources.serverPort:  $config.resources.serverPort"
}

让我们使用不同的输入集来运行它们:

  1. gradle -q printProperties

    Current Environment: dev
    serverName:  http://localhost
    serverPort:  8080
    resources.serverName:  localhost
    resources.serverPort:  8090
    
  2. gradle -q -Penv=dev printProperties

    Current Environment: dev
    serverName:  http://localhost
    serverPort:  8080
    resources.serverName:  localhost
    resources.serverPort:  8090
    
  3. gradle -q -Penv=test printProperties

    Current Environment: test
    serverName:  http://www.testserver.com
    serverPort:  5211
    resources.serverName:  resources.testserver.com
    resources.serverPort:  8090
    
  4. gradle -q -Penv=prod printProperties

    Current Environment: prod
    serverName:  http://www.productionserver.com
    serverPort:  80
    resources.serverName:  resources.productionserver.com
    resources.serverPort:  80
    

另一种方式... 在 build. gradle:

地址:

classpath 'org.flywaydb:flyway-gradle-plugin:3.1'

还有这个:

def props = new Properties()
file("src/main/resources/application.properties").withInputStream { props.load(it) }
apply plugin: 'flyway'
flyway {
url = props.getProperty("spring.datasource.url")
user = props.getProperty("spring.datasource.username")
password = props.getProperty("spring.datasource.password")
schemas = ['db_example']
}

这是针对 Kotlin DSL(build.gradle.kts)的:

import java.util.*
// ...


val properties = Properties().apply {
load(rootProject.file("my-local.properties").reader())
}
val prop = properties["myPropName"]

在 Android 项目中(当应用 Android 插件时)你也可以这样做:

import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
// ...


val properties = gradleLocalProperties(rootDir)
val prop = properties["propName"]

今天刚刚出现了这个问题,我们发现以下方法在当地和我们的管道中都有效:

在 build.gradle:

try {
apply from: 'path/name_of_external_props_file.properties'
} catch (Exception e) {}

这样,当管道中没有找到一个不应该提交到 Git 或其他东西的外部道具文件(就像我们的例子)时,这个‘ application from:’就不会在其中抛出错误。在我们的用例中,我们有一个带有用户标识和密码的文件,它不应该被提交到 Git。除了文件读取的问题之外: 我们发现在外部文件 maven _ user 和 maven _ pass 中声明的变量实际上必须在 gradle.properties 中声明。也就是说,它们只需要像下面这样被提及:

projectName=Some_project_name
version=1.x.y
maven_user=
maven_pass=

我们还发现,在外部文件中,我们也必须在这些值周围加上单引号,否则划分就会混淆。外部文件是这样的:

maven_user='abc123'
maven_pass='fghifh7435bvibry9y99ghhrhg9539y5398'

而不是这样:

maven_user=abc123
maven_pass=fghifh7435bvibry9y99ghhrhg9539y5398

这就是我们要做的,我们很好。我希望这可以帮助其他人。