从gradle到Intellij运行和调试模式注入环境和系统变量

时间:2017-12-08 20:26:56

标签: intellij-idea gradle

我的build.gradle中定义了一些环境变量,我希望IntelliJ在运行/调试单元测试或其他类型的测试时自动加载(包括覆盖和单独的测试运行)

示例:

的build.gradle

plugins {
    id 'org.unbroken-dome.test-sets' version '1.4.2'
}

apply plugin: 'java'
apply plugin: 'idea'

testSets {
    integrationTest {
        dirName = 'integration-test'
    }
}

test {
    environment 'MY_ENV_VAR_1', 'my_env_value_1'
}

integrationTest {
    environment 'MY_ENV_VAR_1', 'my_env_value_1000'
}

测试方法(在测试和集成测试dirs中)

@Test
public void test() {
    System.out.println(System.getenv("MY_ENV_VAR_1"));
}

运行

  • gradle test打印出my_env_value_1
  • gradle integrationTest打印出my_env_value_1000
  • 来自IntelliJ的
  • :右键单击测试并运行 - >没有打印。集成测试也是如此。

我单击了IntelliJ的gradle项目窗格中的“刷新所有gradle项目”按钮。没变。 问题不仅仅是作用于环境变量。能够将系统属性或其他从gradle加载到IntelliJ中的任何运行/调试模式也很不错。

2 个答案:

答案 0 :(得分:0)

在IntelliJ中,请确保将IDE构建/运行操作委派给Gradle,而不是通过IntelliJ本地处理。如果没有勾选,IntelliJ将尝试使用它知道的属性来解析这些变量,这些属性可能正是您正在寻找的。

enter image description here

答案 1 :(得分:0)

IntelliJ不直接支持此功能。您可以做的最好的事情是使用Idea插件生成Intellij项目文件,并更新gradle构建文件以调整输出。

IntelliJ中的环境变量可以定义为运行配置的一部分,因此您可以调整gradle构建以更新单元测试的默认运行配置。

作为原型,将以下内容添加到build.gradle:

idea.workspace.iws.withXml { provider ->
def runManagerNode = provider.asNode().component.find {it.@name == 'RunManager'} as Node
def defaultConfigNode = runManagerNode.configuration.find {it.@default=='true' && it.@type=='JUnit'} as Node

def envsNode = defaultConfigNode.envs[0] as Node
envsNode.appendNode('env', [name: 'MY_ENV_VAR_1', value: test.environment.MY_ENV_VAR_1])
}

现在运行'gradlew cleanIdea idea'并打开生成的项目。

转到run->编辑配置 - > defaults-> junit,您将看到环境变量的值现已传递到IntelliJ。

enter image description here

这样做可行,但有一些问题需要一些思考/工作:

  1. 由于未清除工作区文件,您需要在添加之前检查'env'节点是否已存在。
  2. 我已经对'MY_ENV_VAR_1'这个名称进行了硬编码,只是为了表明它有效。
  3. 如果更改了值,则需要重新生成Idea项目文件并删除JUnit的所有现有运行配置,以便它们获取新的默认值。
  4. 我没有想过区分test和integrationTest环境变量的方法。