Пакет 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
Пошаговое руководство
- Выбор файлов
Сначала нам нужно выбрать все файлы, которые должны попасть в пакет nuget. Добавьте это в <LibraryPackageName>.csproj:
<Project Sdk="Microsoft.NET.Sdk">
...
<ItemGroup Label="Packaging">
<Content Include="<Your directory path>\<your file(s)>" />
</ItemGroup>
Допускается несколько строк содержимого.
- Напишите цель
Создайте целевой файл для копирования файлов до (или после) сборки в каталог 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 файлы не являются частью вашего контроля версий, но ваш пакет!
- Построить и упаковать
В Visual Studio щелкните правой кнопкой мыши имя пакета и выберите «Упаковать». Новый пакет nuget должен быть создан в каталоге bin вашей библиотеки.
- Используйте пакет nuget
Установите пакет nuget сейчас в целевом пакете.
Обратите внимание, что файлы находятся в обозревателе решений, а не в каталоге на вашем диске. У них есть ярлык.
- Создайте целевой пакет
Проверьте каталог bin. Файлы следует скопировать в место, указанное в файлах target.