我正在开发一个 Gradle 脚本,我需要读取
local.properties
文件并使用 build.gradle
中属性文件中的值。我正在按照以下方式进行操作。我运行了下面的脚本,它现在抛出一个错误,但它也没有执行任何操作,例如创建、删除和复制文件。我尝试打印变量的值,它显示了正确的值。
有人可以告诉我这是否是正确的方法吗?我认为另一种方法是定义
gradle.properties
中的所有内容并在 build.gradle
中使用它。有人可以告诉我如何从 build.gradle
访问 build.properties
中的属性吗?
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
如果使用默认的
gradle.properties
文件,您可以直接从 build.gradle
文件中访问属性:
gradle.properties
:
applicationName=Admin
projectName=Hello Cool
build.gradle
:
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")
}
}
查看Gradle 文档的这一部分以获取更多信息。
如果您想动态设置其中一些属性(如下面的评论中所述),您可以创建一个
properties.gradle
文件(名称并不重要)并在您的 build.gradle
脚本中需要它。
properties.gradle
:
ext {
subPath = "some/sub/directory"
fullPath = "$projectDir/$subPath"
}
build.gradle
apply from: 'properties.gradle'
// prints the full expanded path
println fullPath
我们可以使用一个单独的文件(在我的例子中是
config.groovy
)来抽象出所有配置。
在此示例中,我们使用三个环境,即
具有属性 serverName、serverPort 和 resources。 这里我们期望第三个属性资源在多个环境中可能相同,因此我们抽象出该逻辑并在必要时在特定环境中重写:
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"
}
让我们使用不同的输入集来运行它们:
gradle -q printProperties
Current Environment: dev
serverName: http://localhost
serverPort: 8080
resources.serverName: localhost
resources.serverPort: 8090
gradle -q -Penv=dev printProperties
Current Environment: dev
serverName: http://localhost
serverPort: 8080
resources.serverName: localhost
resources.serverPort: 8090
gradle -q -Penv=test printProperties
Current Environment: test
serverName: http://www.testserver.com
serverPort: 5211
resources.serverName: resources.testserver.com
resources.serverPort: 8090
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 或您正在使用的任何内容(如我们的例子)的外部 props 文件时,此“apply from:”不会抛出错误。在我们的用例中,我们有一个带有用户 ID 和密码的文件,该文件不应提交给 Git。除了文件读取的问题之外:我们发现我们在外部文件中声明的变量 maven_user 和 maven_pass 实际上必须在 gradle.properties 中声明。也就是说,只需提及它们即可:
projectName=Some_project_name
version=1.x.y
maven_user=
maven_pass=
我们还发现,在外部文件中,我们也必须在这些值两边加上单引号,否则 Gradle 会感到困惑。所以外部文件看起来像这样:
maven_user='abc123'
maven_pass='fghifh7435bvibry9y99ghhrhg9539y5398'
而不是这个:
maven_user=abc123
maven_pass=fghifh7435bvibry9y99ghhrhg9539y5398
这就是我们所要做的,我们很好。我希望这可以帮助其他人。
对于 Kotlin DSL 你可以使用这个
import java.io.FileInputStream
import java.util.Properties
val properties = Properties().apply {
runCatching { load(FileInputStream("local.propertiess")) }
.onFailure { // Optional block if file does not exists
println("Failed to load properties.")
// set default values here
set("gpr.user", "default user name")
}
}
println(properties["gpr.user"]) // During Gradle Sync this will print current value
它相对于其他答案的优点是,如果
local.properties
不存在,那么 Gradle Sync 不会失败,而是返回空的 Properties 对象。还可以设置默认值并告诉用户属性文件不存在