Repository: jhipster/jhipster-lite
Pull request #12123 (2025-03-16 17:30:28)

feat(github-actions): simplify and modernize github-actions for maven and gradle 
Remove and inline dedicated setup action: it's not necessary to have this separated, this increase complexity, we want a simple setup.
Also improve both gradle and maven github actions (new gradle action, maven in interactive mode, simpler cache setup, ...).


Patch:
diff --git a/src/main/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactory.java
index c48a75232..6d3e07d14 100644
--- a/src/main/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactory.java
+++ b/src/main/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactory.java
@@ -4,8 +4,10 @@ import static tech.jhipster.lite.module.domain.JHipsterModule.from;
 import static tech.jhipster.lite.module.domain.JHipsterModule.moduleBuilder;
 import static tech.jhipster.lite.module.domain.JHipsterModule.to;
 
+import java.util.Locale;
 import tech.jhipster.lite.module.domain.JHipsterModule;
 import tech.jhipster.lite.module.domain.file.JHipsterSource;
+import tech.jhipster.lite.module.domain.javabuild.JavaBuildTool;
 import tech.jhipster.lite.module.domain.npm.NpmVersions;
 import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties;
 import tech.jhipster.lite.shared.error.domain.Assert;
@@ -13,7 +15,6 @@ import tech.jhipster.lite.shared.error.domain.Assert;
 public class GitHubActionsModuleFactory {
 
   private static final JHipsterSource SOURCE = from("ci/github/actions/.github");
-  private static final String ACTIONS_SETUP_ACTION_YML = "actions/setup/action.yml";
 
   private final NpmVersions npmVersions;
 
@@ -22,32 +23,24 @@ public class GitHubActionsModuleFactory {
   }
 
   public JHipsterModule buildGitHubActionsMavenModule(JHipsterModuleProperties properties) {
-    Assert.notNull("properties", properties);
-
-    //@formatter:off
-    return moduleBuilder(properties)
-      .context()
-        .put("nodeVersion", npmVersions.nodeVersion().get())
-        .and()
-      .files()
-        .add(SOURCE.template(ACTIONS_SETUP_ACTION_YML), to(".github/actions/setup/action.yml"))
-        .add(SOURCE.template("workflows/github-actions-maven.yml"), to(".github/workflows/github-actions.yml"))
-        .and()
-      .build();
-    //@formatter:on
+    return buildGitHubActionsModule(properties, JavaBuildTool.MAVEN);
   }
 
   public JHipsterModule buildGitHubActionsGradleModule(JHipsterModuleProperties properties) {
+    return buildGitHubActionsModule(properties, JavaBuildTool.GRADLE);
+  }
+
+  private JHipsterModule buildGitHubActionsModule(JHipsterModuleProperties properties, JavaBuildTool javaBuildTool) {
     Assert.notNull("properties", properties);
 
     //@formatter:off
     return moduleBuilder(properties)
       .context()
         .put("nodeVersion", npmVersions.nodeVersion().get())
+        .put(javaBuildTool.name().toLowerCase(Locale.ROOT), true)
         .and()
       .files()
-        .add(SOURCE.template(ACTIONS_SETUP_ACTION_YML), to(".github/actions/setup/action.yml"))
-        .add(SOURCE.template("workflows/github-actions-gradle.yml"), to(".github/workflows/github-actions.yml"))
+        .add(SOURCE.template("workflows/github-actions.yml"), to(".github/workflows/github-actions.yml"))
         .and()
       .build();
     //@formatter:on
diff --git a/src/main/java/tech/jhipster/lite/generator/ci/github/actions/infrastructure/primary/GitHubActionsModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/ci/github/actions/infrastructure/primary/GitHubActionsModuleConfiguration.java
index a896f5523..fdca21699 100644
--- a/src/main/java/tech/jhipster/lite/generator/ci/github/actions/infrastructure/primary/GitHubActionsModuleConfiguration.java
+++ b/src/main/java/tech/jhipster/lite/generator/ci/github/actions/infrastructure/primary/GitHubActionsModuleConfiguration.java
@@ -3,7 +3,7 @@ package tech.jhipster.lite.generator.ci.github.actions.infrastructure.primary;
 import static tech.jhipster.lite.shared.slug.domain.JHLiteFeatureSlug.GITHUB_ACTIONS;
 import static tech.jhipster.lite.shared.slug.domain.JHLiteModuleSlug.GITHUB_ACTIONS_GRADLE;
 import static tech.jhipster.lite.shared.slug.domain.JHLiteModuleSlug.GITHUB_ACTIONS_MAVEN;
-import static tech.jhipster.lite.shared.slug.domain.JHLiteModuleSlug.GRADLE_JAVA;
+import static tech.jhipster.lite.shared.slug.domain.JHLiteModuleSlug.GRADLE_WRAPPER;
 import static tech.jhipster.lite.shared.slug.domain.JHLiteModuleSlug.MAVEN_JAVA;
 
 import org.springframework.context.annotation.Bean;
@@ -36,7 +36,7 @@ class GitHubActionsModuleConfiguration {
       .slug(GITHUB_ACTIONS_GRADLE)
       .withoutProperties()
       .apiDoc(CONTINUOUS_INTEGRATION_GROUP_DOC, "Add GitHub Actions for Gradle Build")
-      .organization(JHipsterModuleOrganization.builder().feature(GITHUB_ACTIONS).addDependency(GRADLE_JAVA).build())
+      .organization(JHipsterModuleOrganization.builder().feature(GITHUB_ACTIONS).addDependency(GRADLE_WRAPPER).build())
       .tags(CI_TAG, GITHUB_TAG)
       .factory(gitHubActions::buildGitHubActionsGradleModule);
   }
diff --git a/src/main/java/tech/jhipster/lite/generator/ci/renovate/infrastructure/primary/RenovateModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/ci/renovate/infrastructure/primary/RenovateModuleConfiguration.java
index c3ad15212..ff60ed366 100644
--- a/src/main/java/tech/jhipster/lite/generator/ci/renovate/infrastructure/primary/RenovateModuleConfiguration.java
+++ b/src/main/java/tech/jhipster/lite/generator/ci/renovate/infrastructure/primary/RenovateModuleConfiguration.java
@@ -16,7 +16,7 @@ class RenovateModuleConfiguration {
   private static final String RENOVATE_TAG = "renovate";
 
   @Bean
-  JHipsterModuleResource renovateModule(RenovateApplicationService renovateApplicationService) {
+  JHipsterModuleResource renovateMavenModule(RenovateApplicationService renovateApplicationService) {
     return JHipsterModuleResource.builder()
       .slug(RENOVATE)
       .withoutProperties()
diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/async/infrastructure/primary/SpringBootAsyncModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/async/infrastructure/primary/SpringBootAsyncModuleConfiguration.java
index 53e655313..34ed6dd9a 100644
--- a/src/main/java/tech/jhipster/lite/generator/server/springboot/async/infrastructure/primary/SpringBootAsyncModuleConfiguration.java
+++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/async/infrastructure/primary/SpringBootAsyncModuleConfiguration.java
@@ -14,7 +14,7 @@ import tech.jhipster.lite.module.domain.resource.JHipsterModuleResource;
 class SpringBootAsyncModuleConfiguration {
 
   @Bean
-  JHipsterModuleResource springBootAsyncModule(SpringBootAsyncApplicationService springBootAsync) {
+  JHipsterModuleResource springBootAsync(SpringBootAsyncApplicationService springBootAsync) {
     return JHipsterModuleResource.builder()
       .slug(SPRING_BOOT_ASYNC)
       .propertiesDefinition(
diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/dbmigration/neo4jmigrations/infrastructure/primary/Neo4jMigrationsModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/dbmigration/neo4jmigrations/infrastructure/primary/Neo4jMigrationsModuleConfiguration.java
index d41407332..a959d5814 100644
--- a/src/main/java/tech/jhipster/lite/generator/server/springboot/dbmigration/neo4jmigrations/infrastructure/primary/Neo4jMigrationsModuleConfiguration.java
+++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/dbmigration/neo4jmigrations/infrastructure/primary/Neo4jMigrationsModuleConfiguration.java
@@ -14,7 +14,7 @@ import tech.jhipster.lite.module.domain.resource.JHipsterModuleResource;
 class Neo4jMigrationsModuleConfiguration {
 
   @Bean
-  JHipsterModuleResource neo4jMigrationsModule(Neo4jMigrationsApplicationService neo4jMigrations) {
+  JHipsterModuleResource neo4jMigrations(Neo4jMigrationsApplicationService neo4jMigrations) {
     return JHipsterModuleResource.builder()
       .slug(NEO4J_MIGRATIONS)
       .propertiesDefinition(
diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/devtools/infrastructure/primary/DevToolsModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/devtools/infrastructure/primary/DevToolsModuleConfiguration.java
index 678d0be45..26c4f5b51 100644
--- a/src/main/java/tech/jhipster/lite/generator/server/springboot/devtools/infrastructure/primary/DevToolsModuleConfiguration.java
+++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/devtools/infrastructure/primary/DevToolsModuleConfiguration.java
@@ -13,7 +13,7 @@ import tech.jhipster.lite.module.domain.resource.JHipsterModuleResource;
 class DevToolsModuleConfiguration {
 
   @Bean
-  JHipsterModuleResource devToolsModule(DevToolsApplicationService devtools) {
+  JHipsterModuleResource devTools(DevToolsApplicationService devtools) {
     return JHipsterModuleResource.builder()
       .slug(SPRING_BOOT_DEVTOOLS)
       .propertiesDefinition(
diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/mvc/sample/langchain4j/infrastructure/primary/SampleLangChain4jModuleConfiguration.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/mvc/sample/langchain4j/infrastructure/primary/SampleLangChain4jModuleConfiguration.java
index cdb21b3d1..92e0f6322 100644
--- a/src/main/java/tech/jhipster/lite/generator/server/springboot/mvc/sample/langchain4j/infrastructure/primary/SampleLangChain4jModuleConfiguration.java
+++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/mvc/sample/langchain4j/infrastructure/primary/SampleLangChain4jModuleConfiguration.java
@@ -14,7 +14,7 @@ import tech.jhipster.lite.module.domain.resource.JHipsterModuleResource;
 class SampleLangChain4jModuleConfiguration {
 
   @Bean
-  JHipsterModuleResource sampleLangChain4jModule(SampleLangChain4jApplicationService applicationService) {
+  JHipsterModuleResource langChain4jResourceInit(SampleLangChain4jApplicationService applicationService) {
     return JHipsterModuleResource.builder()
       .slug(SPRING_BOOT_LANGCHAIN4J_SAMPLE)
       .propertiesDefinition(
diff --git a/src/main/java/tech/jhipster/lite/module/domain/JHipsterModuleContext.java b/src/main/java/tech/jhipster/lite/module/domain/JHipsterModuleContext.java
index 9bc3a300c..f482ed9f9 100644
--- a/src/main/java/tech/jhipster/lite/module/domain/JHipsterModuleContext.java
+++ b/src/main/java/tech/jhipster/lite/module/domain/JHipsterModuleContext.java
@@ -1,6 +1,7 @@
 package tech.jhipster.lite.module.domain;
 
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder;
 import tech.jhipster.lite.module.domain.javabuild.JavaBuildTool;
@@ -21,7 +22,12 @@ public final class JHipsterModuleContext {
   }
 
   public JHipsterModuleContext withJavaBuildTool(JavaBuildTool javaBuildTool) {
-    Map<String, Object> additionalValues = Map.of(JHipsterModuleProperties.PROJECT_BUILD_DIRECTORY, javaBuildTool.buildDirectory().get());
+    Map<String, Object> additionalValues = Map.of(
+      JHipsterModuleProperties.JAVA_BUILD_TOOL,
+      javaBuildTool.name().toLowerCase(Locale.ROOT),
+      JHipsterModuleProperties.PROJECT_BUILD_DIRECTORY,
+      javaBuildTool.buildDirectory().get()
+    );
     return new JHipsterModuleContext(JHipsterCollections.concat(context, additionalValues));
   }
 
diff --git a/src/main/java/tech/jhipster/lite/module/domain/properties/JHipsterModuleProperties.java b/src/main/java/tech/jhipster/lite/module/domain/properties/JHipsterModuleProperties.java
index cfb402e43..0e68cb438 100644
--- a/src/main/java/tech/jhipster/lite/module/domain/properties/JHipsterModuleProperties.java
+++ b/src/main/java/tech/jhipster/lite/module/domain/properties/JHipsterModuleProperties.java
@@ -16,6 +16,7 @@ public class JHipsterModuleProperties {
   public static final String SERVER_PORT_PARAMETER = "serverPort";
   public static final String SPRING_CONFIGURATION_FORMAT = "springConfigurationFormat";
   public static final String JAVA_VERSION = "javaVersion";
+  public static final String JAVA_BUILD_TOOL = "javaBuildTool";
   public static final String PROJECT_BUILD_DIRECTORY = "projectBuildDirectory";
 
   private final JHipsterProjectFolder projectFolder;
diff --git a/src/main/resources/generator/ci/github/actions/.github/actions/setup/action.yml.mustache b/src/main/resources/generator/ci/github/actions/.github/actions/setup/action.yml.mustache
deleted file mode 100644
index 020511353..000000000
--- a/src/main/resources/generator/ci/github/actions/.github/actions/setup/action.yml.mustache
+++ /dev/null
@@ -1,23 +0,0 @@
-name: 'Setup'
-description: 'Setup environment with Java 21, Node 20'
-runs:
-  using: 'composite'
-  steps:
-    - name: 'Setup: Node.js'
-      uses: actions/setup-node@v4
-      with:
-        node-version: {{nodeVersion}}
-    - name: 'Setup: update NPM'
-      shell: bash
-      run: npm install -g npm
-    - name: 'Setup: Java'
-      uses: actions/setup-java@v4
-      with:
-        distribution: 'temurin'
-        java-version: {{javaVersion}}
-    - name: 'Setup: check tools'
-      shell: bash
-      run: |
-        node -v
-        npm -v
-        java -version
diff --git a/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions.yml.mustache b/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions.yml.mustache
new file mode 100644
index 000000000..1846d3696
--- /dev/null
+++ b/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions.yml.mustache
@@ -0,0 +1,45 @@
+name: build
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || (github.ref == 'refs/heads/main' && github.sha) || github.ref }}
+  cancel-in-progress: true
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+    branches:
+      - main
+jobs:
+  #--------------------------------------------------
+  # Build and Tests the project on Linux
+  #--------------------------------------------------
+  tests:
+    name: tests
+    runs-on: ubuntu-latest
+    timeout-minutes: 20
+    steps:
+      - name: 'Setup: checkout project'
+        uses: actions/checkout@v4
+      - name: 'Setup: Node.js'
+        uses: actions/setup-node@v4
+        with:
+          node-version: {{nodeVersion}}
+      - name: 'Setup: Java'
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'temurin'
+          java-version: {{javaVersion}}
+          cache: {{javaBuildTool}}
+{{#maven}}
+      - name: 'Test: run tests'
+        run: |
+          mvn --batch-mode -ntp clean verify
+{{/maven}}
+{{#gradle}}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v4
+      - name: 'Test: run unit tests'
+        run: ./gradlew clean test --no-daemon
+      - name: 'Test: run integration tests'
+        run: ./gradlew integrationTest --no-daemon
+{{/gradle}}
diff --git a/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions-gradle.yml.mustache b/src/test/resources/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.shouldBuildGitHubActionsGradleModule.github-actions.yml.approved.txt
similarity index 71%
rename from src/main/resources/generator/ci/github/actions/.github/workflows/github-actions-gradle.yml.mustache
rename to src/test/resources/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.shouldBuildGitHubActionsGradleModule.github-actions.yml.approved.txt
index 7915ca2b8..1d0fd88a2 100644
--- a/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions-gradle.yml.mustache
+++ b/src/test/resources/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.shouldBuildGitHubActionsGradleModule.github-actions.yml.approved.txt
@@ -20,11 +20,18 @@ jobs:
     steps:
       - name: 'Setup: checkout project'
         uses: actions/checkout@v4
-      - name: 'Setup: environment'
-        id: setup
-        uses: ./.github/actions/setup
+      - name: 'Setup: Node.js'
+        uses: actions/setup-node@v4
+        with:
+          node-version: 44
+      - name: 'Setup: Java'
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'temurin'
+          java-version: 21
+          cache: gradle
       - name: Setup Gradle
-        uses: gradle/gradle-build-action@v2
+        uses: gradle/actions/setup-gradle@v4
       - name: 'Test: run unit tests'
         run: ./gradlew clean test --no-daemon
       - name: 'Test: run integration tests'
diff --git a/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions-maven.yml.mustache b/src/test/resources/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.shouldBuildGitHubActionsMavenModule.github-actions.yml.approved.txt
similarity index 50%
rename from src/main/resources/generator/ci/github/actions/.github/workflows/github-actions-maven.yml.mustache
rename to src/test/resources/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.shouldBuildGitHubActionsMavenModule.github-actions.yml.approved.txt
index e0a962ffd..7b8993c47 100644
--- a/src/main/resources/generator/ci/github/actions/.github/workflows/github-actions-maven.yml.mustache
+++ b/src/test/resources/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.shouldBuildGitHubActionsMavenModule.github-actions.yml.approved.txt
@@ -1,4 +1,7 @@
 name: build
+concurrency:
+  group: ${{ github.workflow }}-${{ github.head_ref || (github.ref == 'refs/heads/main' && github.sha) || github.ref }}
+  cancel-in-progress: true
 on:
   push:
     branches:
@@ -17,17 +20,16 @@ jobs:
     steps:
       - name: 'Setup: checkout project'
         uses: actions/checkout@v4
-      - name: 'Setup: environment'
-        id: setup
-        uses: ./.github/actions/setup
-      - name: 'Init: cache local Maven repository'
-        uses: actions/cache@v4
+      - name: 'Setup: Node.js'
+        uses: actions/setup-node@v4
         with:
-          path: ~/.m2/repository
-          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
-          restore-keys: |
-            ${{ runner.os }}-maven-
+          node-version: 44
+      - name: 'Setup: Java'
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'temurin'
+          java-version: 21
+          cache: maven
       - name: 'Test: run tests'
         run: |
-          chmod +x mvnw
-          ./mvnw clean verify
+          mvn --batch-mode -ntp clean verify


Test patch:
diff --git a/src/test/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.java
index 183b8b1e4..9a70f1f81 100644
--- a/src/test/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.java
+++ b/src/test/java/tech/jhipster/lite/generator/ci/github/actions/domain/GitHubActionsModuleFactoryTest.java
@@ -1,7 +1,9 @@
 package tech.jhipster.lite.generator.ci.github.actions.domain;
 
 import static org.mockito.Mockito.when;
-import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.assertThatModule;
+import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.assertThatModuleWithFiles;
+import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.gradleBuildFile;
+import static tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.pomFile;
 
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -33,11 +35,7 @@ class GitHubActionsModuleFactoryTest {
 
     JHipsterModule module = factory.buildGitHubActionsMavenModule(properties);
 
-    assertThatModule(module)
-      .hasFiles(".github/workflows/github-actions.yml")
-      .hasFile(".github/actions/setup/action.yml")
-      .containing("java-version: 21")
-      .containing("node-version: 44");
+    assertThatModuleWithFiles(module, pomFile()).hasFile(".github/workflows/github-actions.yml").matchingSavedSnapshot();
   }
 
   private void mockNodeVersion() {
@@ -51,10 +49,6 @@ class GitHubActionsModuleFactoryTest {
 
     JHipsterModule module = factory.buildGitHubActionsGradleModule(properties);
 
-    assertThatModule(module)
-      .hasFiles(".github/workflows/github-actions.yml")
-      .hasFile(".github/actions/setup/action.yml")
-      .containing("java-version: 21")
-      .containing("node-version: 44");
+    assertThatModuleWithFiles(module, gradleBuildFile()).hasFile(".github/workflows/github-actions.yml").matchingSavedSnapshot();
   }
 }
diff --git a/src/test/java/tech/jhipster/lite/module/domain/JHipsterModuleContextTest.java b/src/test/java/tech/jhipster/lite/module/domain/JHipsterModuleContextTest.java
index 22d53726e..477dc48f9 100644
--- a/src/test/java/tech/jhipster/lite/module/domain/JHipsterModuleContextTest.java
+++ b/src/test/java/tech/jhipster/lite/module/domain/JHipsterModuleContextTest.java
@@ -34,7 +34,7 @@ class JHipsterModuleContextTest {
     Map<String, Object> newContext = context.withJavaBuildTool(JavaBuildTool.GRADLE).get();
 
     assertThat(newContext)
-      .hasSize(8)
+      .hasSize(9)
       .containsKey("baseName")
       .containsKey("projectName")
       .containsKey("packageName")
@@ -42,6 +42,7 @@ class JHipsterModuleContextTest {
       .containsKey("indentSize")
       .containsKey("javaVersion")
       .containsKey("springConfigurationFormat")
+      .containsEntry("javaBuildTool", "gradle")
       .containsEntry("projectBuildDirectory", "build");
 
     assertThat(context.get()).containsEntry("projectBuildDirectory", "target");