#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
Я ожидаю, что это будет
- извлеките мою зависимость, как определено в корневом проекте
- скопируйте ее в локальный проект
- сборка
- скопируйте библиотеку 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)
}
Теперь это действительно работает. Однако приведенный выше пример на самом деле может быть лучше, поскольку он просто менее сложный.