如何在Gradle的Exec任务中访问配置的环境变量?
Gradle Exec任务环境变量访问问题解决
问题根源
你代码里的$NAME无法访问,核心是混淆了Gradle脚本上下文和子进程上下文:
- 通过
environment()设置的变量,是给echo这类子进程用的环境变量,不属于Gradle脚本本身的可直接引用变量; argumentProviders的代码在Gradle脚本环境中执行,直接写$NAME只会查找脚本内定义的变量,自然取不到值。
解决方案
方案1:直接传递参数(无需环境变量)
如果只是要把指定字符串传给echo,没必要绕环境变量,直接在脚本里定义变量传递即可:
tasks { register<Exec>("run") { val name = "mohammad" executable = "echo" argumentProviders.add { listOf(name) } } }
方案2:让子进程通过环境变量读取(依赖shell)
如果业务场景确实需要子进程通过环境变量获取值,可以用bash -c调用shell,让shell解析环境变量(注意转义$或用单引号避免Gradle提前解析):
tasks { register<Exec>("run") { environment(mapOf( "NAME" to "mohammad", )) // 用\$转义让shell处理变量,或用单引号包裹echo内容 commandLine("bash", "-c", "echo \$NAME") } }
方案3:从任务的environment属性中取值
如果不想依赖shell,可直接从Exec任务的environment属性里取出已设置的值,传递给参数:
tasks { register<Exec>("run") { environment(mapOf( "NAME" to "mohammad", )) executable = "echo" argumentProviders.add { listOf(environment["NAME"].orEmpty()) } } }
内容的提问来源于stack exchange,提问作者Mohammad Abdollahzadeh
相关产品推荐
相关产品推荐

