Пакет nuget ядра dotnet, копирующий файлы содержимого при восстановлении

Так что я чувствую, что подошел к концу веревки здесь, но надеюсь, что кто-то знает больше, чем я здесь. у меня есть немного Typescript файлы, хотя это в основном не имеет значения, поскольку у меня возникла эта проблема со всеми файлами содержимого.

Я могу генерировать nuget или точнее dotnet pack, пакет nuget, который включает мои файлы содержимого в пакет, используя это в .csproj из моего parent проект:

<ItemGroup>
  <Content Include="Scripts\Utility.ts">
    <Pack>true</Pack>
    <PackagePath>contentFiles\Scripts\;content\Scripts</PackagePath>
  </Content>
</ItemGroup>

Я могу просмотреть сгенерированный .nupkg и увидеть, что файл действительно был добавлен в пакет в content\Scripts а также contentFiles\Scripts места

Проблема в том, что всякий раз, когда я использую этот пакет в моем "дочернем" проекте, это Typescript никогда не копируется в какую-либо папку child проект, хотя я вижу его извлеченным в .nuget\packages\parent\... папки.

Сначала я подумал, что это что-то с моими начальными настройками в parent проект, и это может быть, но после попытки, что похоже на все в книге, не удается скопировать файлы содержимого в child проект. Затем я попытался пойти темным путем, пытаясь использовать Init.ps1 в tools папка моего пакета, и хотя это было невозможно отладить, он также, казалось, работал споратически (я полностью переустановил и переустановил пакет, и он все еще не запускался большую часть времени.) Это может быть путь, но я не знаю почему я не могу получить его на выход Package Manager Console... может быть, еще есть надежда с Init.ps1 но я не могу понять это. Наконец я вижу некоторый потенциал с нюгетом .targets файл, но я могу, кажется, понять, как использовать его для моих целей! Я хотел бы получить некоторые отзывы о том, как это сделать.

4 ответа

Решение

От: Объявление NuGet 3.1 с поддержкой универсальной платформы Windows

Импорт содержимого из пакета Nuget не рекомендуется для проектов, использующих файл project.json в Nuget v3.1. С тех пор файл project.json был удален в пользу нового формата.csproj. Импорт содержимого из пакета Nuget все равно должен работать, если вы используете вместо него файл packages.config.

Также упоминается тот факт, что для доставки контента доступны другие менеджеры пакетов.

Мне кажется, что ответом в новом мире является создание модуля узла, содержащего utility.js, и позволить npm доставить его в ваш проект.

Возможное решение:

Я посмотрел на.targets, чтобы скопировать файлы, и это сработало, но оно работает на каждой сборке - что может быть или не быть проблемой для вас. Я не могу делать то, что я хочу с этим.

образ

В [PackageId].targets:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- Either do this for all scripts in the Scripts/js folder -->
    <Target Name="CopyScriptsToProject" BeforeTargets="Build">
        <Message Text="Copying scripts to project" />
        <ItemGroup>
            <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\content\Scripts\js\**\*.*"/>
        </ItemGroup>
        <Copy SourceFiles="@(SourceScripts)" DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\wwwroot\js\%(RecursiveDir)%(Filename)%(Extension)')" Condition="!Exists('$(MSBuildProjectDirectory)\wwwroot\js\%(RecursiveDir)%(Filename)%(Extension)')" />
    </Target>
    <!-- Or do this for the individual script -->
    <Target Name="CopyUtilityScriptToProject" BeforeTargets="Build">
        <Copy SourceFiles="$(MSBuildThisFileDirectory)..\..\content\Scripts\js\Utility.js" DestinationFiles="$(MSBuildProjectDirectory)\wwwroot\js\Utility.js" Condition="!Exists('$(MSBuildProjectDirectory)\wwwroot\js\Utility.js')" />
    </Target>
</Project>
<!-- Note: condition can be removed from either if you want it to overwrite each build -->

и в файле.csproj (заменив [PackageId] именем вашего пакета):

<Project Sdk="Microsoft.NET.Sdk">
    ... any Globals for source control stuff ...
    <PropertyGroup>
        <TargetFramework>netcoreapp2.0</TargetFramework>
        <Version>7.0.0</Version>
        <PackageId>[PackageId]</PackageId>
    </PropertyGroup>
    ... any PackageReference stuff ...
    <ItemGroup Label="Packaging">
        <Content Include="build\netcoreapp2.0\[PackageId].targets" PackagePath="build\netcoreapp2.0\[PackageId].targets" />
            <!-- Either -->
            <Content Include="Scripts\js\**\*.*" PackagePath="content\Scripts\js;contentFiles\Scripts\js" />
            <!-- or -->
            <Content Include="Scripts\js\Utility.js" PackagePath="content\Scripts\js;contentFiles\Scripts\js" />
        </ItemGroup>
</Project> 

Казалось бы, ошибка, когда <PackageId>[PackageId]</PackageId> не был установлен явно в.csproj, цели сборки не работали. Хотя это может быть проблемой с моей средой разработки.

Видимо вам нужно any\any в пути ( узнать больше), а также включить <PackageCopyToOutput>true</PackageCopyToOutput>, как это:

<ItemGroup>
  <Content Include="Scripts\js\Utility.js">
    <Pack>true</Pack>

    <PackagePath>contentFiles\any\any\wwwroot\js\;content\any\any\wwwroot\js\</PackagePath>

    <PackageCopyToOutput>true</PackageCopyToOutput>
  </Content>
</ItemGroup>

Вам также нужно будет предварительно скомпилировать TypeScript перед включением .js файлы в пакете

Тем не менее, это все равно не создает файл, просто какая-то странная ссылка на него.

В конце концов, мы получили его с .targets Рабочий файл репозитория можно найти здесь: https://github.com/NuGet/Home/issues/6743

Ответ Сержа Сагана направил меня на правильный путь, но этого было недостаточно для развертывания файла содержимого вbinсправочник (как он заметил). Мне удалось развернуть файл, изменив параметры ссылки на пакет в файле.csproj потребляющего проекта следующим образом:

<PackageReference Include="MyNuGetPackage" Version="0.0.0.1">
  <IncludeAssets>all</IncludeAssets>
  <PrivateAssets>analyzers;build</PrivateAssets>
</PackageReference>

Похоже, что по умолчанию для PrivateAssets является contentfiles;analyzers;build (документация), чего мы не хотим в данном случае.

Упрощенный код и объяснение от @PurplePiranha

TL;DR:

Базовый упрощенный пример кода .NET6 на Github

Пошаговое руководство

  1. Выбор файлов

Сначала нам нужно выбрать все файлы, которые должны попасть в пакет nuget. Добавьте это в <LibraryPackageName>.csproj:

      <Project Sdk="Microsoft.NET.Sdk">
  ...
  <ItemGroup Label="Packaging">
    <Content Include="<Your directory path>\<your file(s)>" />
  </ItemGroup>

Допускается несколько строк содержимого.

  1. Напишите цель

Создайте целевой файл для копирования файлов до (или после) сборки в каталог bin:

Расположение и имя этого файла важны:<root>\build\<LibraryPackageName>.targets

Теперь убедитесь, что он будет выполнен, сославшись на него в <LibraryPackageName>.csproj, добавив строку содержимого:

      <Project Sdk="Microsoft.NET.Sdk">
  ...
  <ItemGroup Label="Packaging">
    <Content Include="build\<LibraryPackageName>.targets" PackagePath="build\<LibraryPackageName>.targets" />

    <Content Include="filesToAdd\*.txt">
      <Pack>true</Pack>
    </Content>
  </ItemGroup>

Например: Из кода в github:

      <Project Sdk="Microsoft.NET.Sdk">
  ...
  <ItemGroup Label="Packaging">
    <Content Include="build\PackageToGenerateFile.targets" PackagePath="build\PackageToGenerateFile.targets" />

    <Content Include="filesToAdd/*.txt">
      <Pack>true</Pack>
    </Content>
  </ItemGroup>

ПРИМЕЧАНИЕ. При копировании файлов в каталог bin файлы не являются частью вашего контроля версий, но ваш пакет!

  1. Построить и упаковать

В Visual Studio щелкните правой кнопкой мыши имя пакета и выберите «Упаковать». Новый пакет nuget должен быть создан в каталоге bin вашей библиотеки.

  1. Используйте пакет nuget

Установите пакет nuget сейчас в целевом пакете.

Обратите внимание, что файлы находятся в обозревателе решений, а не в каталоге на вашем диске. У них есть ярлык.

  1. Создайте целевой пакет

Проверьте каталог bin. Файлы следует скопировать в место, указанное в файлах target.

Другие вопросы по тегам