Пакет Nuget.цели не могут найти файлы в задаче копирования

#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>