如何读取属性文件并使用项目 Gradle 脚本中的值?

新手上路,请多包涵

我正在编写一个 Gradle 脚本,我需要在该脚本中读取 local.properties 文件并使用 build.gradle 中的属性文件中的值。我正在按照以下方式进行操作。我运行了下面的脚本,它现在抛出了一个错误,但它也没有做任何事情,比如创建、删除和复制文件。我试图打印变量的值,它显示了正确的值。

有人可以让我知道这是否是正确的方法吗?我认为另一种方法是在 --- 中定义所有内容并在 build.gradle gradle.properties 中使用它。有人可以告诉我如何从 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

原文由 unknown 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

如果使用默认的 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

原文由 blacktide 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

  1. 开发
  2. 测试
  3. 产品

它具有属性 serverNameserverPortresources在这里,我们期望第三个属性 资源 在多个环境中可能相同,因此我们抽象出该逻辑并在必要时在特定环境中覆盖:

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

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

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

  1. gradle -q -Penv=prod printProperties
    Current Environment: prod
   serverName:  http://www.productionserver.com
   serverPort:  80
   resources.serverName:  resources.productionserver.com
   resources.serverPort:  80

原文由 Raman Sahasi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题