зависимость gradle не выполняется

#gradle

#gradle

Вопрос:

Моя ситуация такова:

  • прежде чем я смогу упаковать это приложение, мне нужно извлечь общую зависимость
  • Я извлекаю ее один раз в корневой каталог, а затем копирую в подпроект для ускорения
  • Мне нужно затем построить
  • поместите артефакт сборки в этот скопированный каталог

Итак, когда я запускаю этот пример задачи, он переносит зависимость в корневую папку, но никогда не копирует ее, и я просто не понимаю, почему. Ниже приведена моя урезанная сборка kotlin

 import com.ullink.Msbuild
import java.io.File



plugins {
    id("com.ullink.msbuild") version "3.8" apply false

}
subprojects {
    apply(plugin = "com.ullink.msbuild")
    val solution = projectDir.walkTopDown().find { it.extension == "sln" }!!
    tasks {

        val restore by register("restore", Exec::class) {
            executable = "nuget"
            args = listOf(
                    "restore", solution.canonicalPath,
                    "-Source",
                    (getenv("NUGET_SOURCE") ?: project.properties["package.sources"]) as String
            )
        }

        val msbuild by named<Msbuild>("msbuild") {
            dependsOn(restore)
            solutionFile = solution
            projectName = project.name
            verbosity = "quiet"
            targets = listOf("Clean", "Rebuild")
            configuration = "Release"
        }

        val cpfms by register<Copy>("cpFms"){
            dependsOn(rootProject.tasks.named("pullfms"))
            doLast{
                println("cpFms do last")

                val from = projectDir
                        .listFiles()
                        .find{ it.isDirectory() amp;amp; it.name.toLowerCase().startsWith("prism.core.fulfillmentmicroservice") }!!
                println("making copy ${from} -> ${projectDir}")
                from(from)

                into(projectDir)
            }
        }

        val build by named("build") {
            dependsOn(msbuild)
        }
        val cpdll by register<Copy>("cpFmsdll") {
            dependsOn(cpfms,build)

            doLast{
                println("cpFmsdll do last")
                val from = projectDir.walkTopDown().find{ it.name == "PRISMDataAdaptor.dll" }!!
                val to = projectDir.listFiles().find{ it.isDirectory() amp;amp; it.name.toLowerCase().startsWith("prism.core.fulfillmentmicroservice") }!!
                println("cp dll ${from} -> ${to}")
                from(from)
                into(to)
            }
        }
        

    }
}


tasks{
    val pullFms by register("pullfms", Exec::class) {
        args = listOf(
                "install", "PRISM.Core.FulfillmentMicroService",
                "-Source", (getenv("NUGET_PUBLISH") ?: project.properties["publish.repo"]) as String
        )
        executable = "nuget"
    }
}
  

поэтому, когда я запускаю
gradle :adaptor-cwi_ky_statewide_smd:cpFmsdll

Я ожидаю, что это будет

  1. извлеките мою зависимость, как определено в корневом проекте
  2. скопируйте ее в локальный проект
  3. сборка
  4. скопируйте библиотеку DLL сборки в папку на шаге 2

Пробный запуск показывает, чего я ожидаю:

 PS C:Userscbongiornodevsterlingprismprism-adaptors> gradle --dry-run :adaptor-cwi_ky_statewide_smd:cpFmsdll
:adaptor-cwi_ky_statewide_smd:assemble SKIPPED
:adaptor-cwi_ky_statewide_smd:check SKIPPED
:adaptor-cwi_ky_statewide_smd:restore SKIPPED
:adaptor-cwi_ky_statewide_smd:msbuild SKIPPED
:adaptor-cwi_ky_statewide_smd:build SKIPPED
:pullfms SKIPPED
:adaptor-cwi_ky_statewide_smd:cpFms SKIPPED
:adaptor-cwi_ky_statewide_smd:cpFmsdll SKIPPED
  

но выполнение на самом деле этого не делает?! Напрямую не копируется в локальный проект, но он находится в корневом проекте

 PS C:Userscbongiornodevsterlingprismprism-adaptors> gradle :adaptor-cwi_ky_statewide_smd:cpFmsdll

> Task :adaptor-cwi_ky_statewide_smd:restore
MSBuild auto-detection: using msbuild version '15.5.180.51428' from 'C:Program Files (x86)Microsoft Visual Studio2017ProfessionalMSBuild15.0bin'.
All packages listed in packages.config are already installed.

> Task :pullfms
Feeds used:
  https://repo.dev.backgroundcheck.com/nexus/repository/nuget-group/

Installing package 'PRISM.Core.FulfillmentMicroService' to 'C:Userscbongiornodevsterlingprismprism-adaptors'.
  CACHE https://repo.dev.backgroundcheck.com/nexus/repository/nuget-group/FindPackagesById()?id='PRISM.Core.FulfillmentMicroService'amp;semVerLevel=2.0.0
Package "PRISM.Core.FulfillmentMicroService.0.0.77" is already installed.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 6s
3 actionable tasks: 3 executed
PS C:Userscbongiornodevsterlingprismprism-adaptors> ls | select -Last 20


    Directory: C:Userscbongiornodevsterlingprismprism-adaptors


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        7/14/2020  10:08 PM                gradle
d-----        7/21/2020   3:36 PM                infra
d-----        5/13/2020   4:17 AM                PRISM-Adaptor-QC_LA_SaintBernard
d-----        8/25/2020   4:25 PM                PRISM.Core.FulfillmentMicroService.0.0.77
d-----        7/14/2020   8:07 AM                routeadaptor-apinationwide_msmj1_dre
d-----        5/13/2020   4:18 AM                serviceadaptor-cwi_ky_statewide_smd
d-----        5/13/2020   4:18 AM                serviceadaptor-cwi_ny_statewide
d-----        5/13/2020   4:18 AM                serviceadaptor-qc_ny_statewide
-a----        7/14/2020   8:07 AM           2581 .gitattributes
-a----        8/25/2020   4:22 PM          13996 .gitignore
-a----        8/25/2020   4:51 PM           6653 build.gradle.kts
-a----        7/21/2020   3:36 PM            987 Dockerfile
-a----        8/14/2020   4:28 PM            206 gradle.properties
-a----        7/14/2020  10:08 PM           5764 gradlew
-a----        7/14/2020  10:08 PM           2942 gradlew.bat
-a----        7/21/2020   3:36 PM           2222 Jenkinsfile
-a----        5/13/2020   4:17 AM          11565 PRISM-Adaptors.txt
-a----        7/14/2020   8:07 AM            722 README.md
-a----        8/25/2020   3:24 PM            416 settings.gradle.kts
-a----        7/14/2020   8:07 AM            978 sh.exe.stackdump


PS C:Userscbongiornodevsterlingprismprism-adaptors> ls .adaptor-cwi_ky_statewide_smd


    Directory: C:Userscbongiornodevsterlingprismprism-adaptorsadaptor-cwi_ky_statewide_smd


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        7/21/2020   1:24 PM                build
d-----        7/21/2020   1:14 PM                CWI_KY_STATEWIDE_SMDSol
-a----        5/13/2020   4:17 AM           2581 .gitattributes


PS C:Userscbongiornodevsterlingprismprism-adaptors>
  

в конце я вижу, что в основном нужно повторить этот код (пример):

 nuget.exe restore CWI_TN_DAVIDSON_SMDSolCWI_TN_DAVIDSON_SMDSol.sln -source "https://www.nuget.org/api/v2;http://prism-prod-oct/NuGetLocalServer/nuget"
MSBuild.exe C:PRISMGitadaptor-cwi_tn_davidson_smdCWI_TN_DAVIDSON_SMDSolCWI_TN_DAVIDSON_SMDSol.sln /t:Clean /p:Configuration=Release
MSBuild.exe C:PRISMGitadaptor-cwi_tn_davidson_smdCWI_TN_DAVIDSON_SMDSolCWI_TN_DAVIDSON_SMDSol.sln /t:Rebuild /p:Configuration=Release

Set-Location C:PRISMGitadaptor-cwi_tn_davidson_smdCWI_TN_DAVIDSON_SMDSolPRISM.Adaptor.CWI.TN.DAVIDSON.SMD

$Package = Find-Package -Name PRISM.Core.FulfillmentMicroService -Source http://prism-prod-oct/NuGetLocalServer/nuget

NuGet.exe install $Package.Name  -Version $Package.Version -source http://prism-prod-oct/NuGetLocalServer/nuget

Copy-Item -Path .binReleasePRISMDataAdaptor.dll -Destination ("." $Package.Name  "."   $Package.Version "")   -Recurse -Force
  

Комментарии:

1. projectDir как и в val from = projectDir в задаче копирования подпроекта, относится к каталогу подпроекта, но артефакт находится в корневом каталоге проекта. Это проблема?

2. Похоже, что он даже не пытается скопировать.

Ответ №1:

Что касается конфигурации вашей задачи копирования:

 val cpfms by register<Copy>("cpFms") {
    dependsOn(rootProject.tasks.named("pullfms"))
    doLast {
        // ...
        from(from)
        into(projectDir)
    }
}

val cpdll by register<Copy>("cpFmsdll") {
    dependsOn(cpfms,build)
    doLast {
        // …
        from(from)
        into(to)
    }
}
  

Проблема в том, что вы настраиваете свою задачу копирования во время ее выполнения. Поэтому я думаю, что ваши задачи не настроены, а затем не выполняются.

Вы можете увидеть пример конфигурации в документации по копированию Gradle. Нет doLast части.

Ваша задача копирования полагается на файл / каталог, созданные более ранней задачей. Я думаю, вам следует учитывать, что файл будет здесь, и использовать include from в отношении шаблона, а не в отношении того, что файлы действительно здесь (что может объяснить, почему вы использовали doLast )

Пример:

 val cpfms by register<Copy>("cpFms") {
    dependsOn(rootProject.tasks.named("pullfms"))
    from("**/PRISMDataAdaptor.dll")
    into("prism.core.fulfillmentmicroservice")
}
  

Комментарии:

1. Я пробовал это с конфигурацией, как у вас есть — проблема, я думаю, в том, что он пытается разрешить файл, который ему нужно скопировать во время настройки, который не существует (пока) и, следовательно, NPE, поэтому я попытался переместить его в doLast. Но, я думаю, потому что, как вы указываете, нет doLast, он в основном видит незастроенную задачу копирования. Объясняя это только сейчас, я вижу, в чем проблема — возможно, я знаю, как это исправить. Ваше решение может работать, но оно не решает проблему напрямую. Позвольте мне посмотреть, что я могу сделать

2. Я отдал вам предпочтение за то, что вы указали мне правильный путь и потенциально дали мне лучшее решение, чем то, что у меня есть (еще не пробовал). Однако для получения вознаграждения он должен был решить проблему, как было предложено. Сложно получить какой-либо ответ для gradle на SOF, поэтому я уверен, что вернусь, предлагая другой

Ответ №2:

Хорошо, спасибо @dwursteisen за то, что наставил меня на правильный путь. Решение этой конкретной проблемы потребовало использования делегирования:

       val cpfms by register<Copy>("cpFms") {
            dependsOn(rootProject.tasks.named("pullfms"))

            val from by lazy {
                rootProject.projectDir.listFiles()
                        .find { it.isDirectory() amp;amp; it.name.toLowerCase().startsWith("prism.core.fulfillmentmicroservice") }
            }
            from(from)
            into(projectDir)
        }
  

Теперь это действительно работает. Однако приведенный выше пример на самом деле может быть лучше, поскольку он просто менее сложный.