#c# #msbuild #nuget
Вопрос:
Предыстория: У меня есть библиотека, предназначенная для использования с игровым движком C#. В этом игровом движке есть редактор, который подбирает плагины через Plugins/
каталог проекта (не включен в вывод сборки). Чтобы облегчить жизнь пользователям, я хочу упаковать свою библиотеку и связанные с ней плагины редактора, упакованные и развернутые вместе в один файл nuget. Таким образом, пользователям не придется вручную управлять версиями двух разных наборов файлов.
Проблема:
Nuget больше не имеет возможности копировать файлы содержимого по умолчанию. Основываясь на поиске, единственный способ выполнить это-использовать задачи, заданные в package.targets
файле msbuild. Итак, у меня есть следующее в моем csproj
<ItemGroup>
<Content Include="../Parme.Frb.Example/Plugins/**/*">
<Pack>true</Pack>
<PackagePath>contentPlugins</PackagePath>
</Content>
<Content Include="Parme.Frb.targets">
<Pack>true</Pack>
<PackagePath>build</PackagePath>
</Content>
</ItemGroup>
Parme.Frb.Example/Plugins
Папка содержит файлы плагинов, которые я хочу включить в файл nuget. Мой Parme.Frb.targets
файл msbuild содержит:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<GluePluginFiles>$(MSBuildThisFileDirectory)..contentPlugins***</GluePluginFiles>
</PropertyGroup>
<Target Name="CopyGluePlugin" BeforeTargets="PreBuildEvent">
<Copy SourceFiles="$(GluePluginFiles)"
DestinationFolder="$(ProjectDir)Plugins%(GluePluginFiles.RecursiveDir)"
SkipUnchangedFiles="true" />
</Target>
</Project>
Намерение состоит в том, что он скопирует все файлы из <nuget-cache>/<package>/content/Plugins
каталога и рекурсивно скопирует их Plugins/
в каталог проекта.
Когда я смотрю на встроенный файл nuget, я вижу все включенные файлы содержимого
Поэтому я загружаю этот файл nuget в пустой проект и запускаю сборку, которая приводит к следующим ошибкам:
Build started 4/12/2021 4:56:42 PM.
Logging verbosity is set to: Normal. 1>Project "C:UsersmeRiderProjectsNugetTestNugetTestNugetTest.csproj" on node 1 (build target(s)).
1>C:Usersme.nugetpackagesparme.frb.8.3-test10buildParme.Frb.targets(7,9): error MSB3030: Could not copy the file "C:Usersme.nugetpackagesparme.frb.8.3-test10build..contentPlugins***" because it was not found.
1>Done Building Project "C:UsersmeRiderProjectsNugetTestNugetTestNugetTest.csproj" (build target(s)) -- FAILED.
Build FAILED.
"C:UsersmeRiderProjectsNugetTestNugetTestNugetTest.csproj" (build target) (1) ->
(CopyGluePlugin target) ->
C:Usersme.nugetpackagesparme.frb.8.3-test10buildParme.Frb.targets(7,9): error MSB3030: Could not copy the file "C:Usersme.nugetpackagesparme.frb.8.3-test10build..contentPlugins***" because it was not found.
0 Warning(s)
1 Error(s)
Time Elapsed 00:00:00.33
Однако файлы, безусловно, существуют в этом каталоге:
PS C:Usersme> ls C:Usersme.nugetpackagesparme.frb.8.3-test10build..contentPlugins
Directory: C:Usersme.nugetpackagesparme.frb.8.3-test10contentPlugins
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 4/12/2021 4:56 PM Parme.Frb.GluePlugin
Я попытался реорганизовать пакет nuget , чтобы удалить ..
, я попытался удалить GluePlugins.
часть RecursiveDir
(которой, похоже, нет в большинстве задач, но это вызывает другую ошибку » и т. Д.. Я перепробовал кучу вещей и не могу заставить это работать.
У кого-нибудь есть какие-либо идеи о том, как я могу получить это копирование, не указывая вручную каждый файл?
Ответ №1:
Я не знаю конкретно, почему это работает, но после долгих проб и ошибок я заставил его работать с помощью:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<GluePluginFile Include="$(MSBuildThisFileDirectory)..contentPlugins***" />
</ItemGroup>
<Target Name="CopyGluePlugin" BeforeTargets="PreBuildEvent">
<Message Importance="normal" Text="Copying Glue plugin files" />
<Copy SourceFiles="@(GluePluginFile)"
DestinationFolder="$(ProjectDir)Plugins%(RecursiveDir)"
SkipUnchangedFiles="true" />
</Target>
</Project>