Подтвердить что ты не робот

Различия между nuget-упаковкой csproj vs. nuspec

Недавно я начал упаковывать пакеты nuget из нескольких моих проектов. Сначала я начал с приложения Package Explorer. Это хороший инструмент, но он менее полезен, если вы выполняете непрерывную интеграцию. Затем я просмотрел спецификацию файла шаблона nuspec и передачу измененных данных, например. номер версии, в качестве аргументов командной строки. Позже я задавался вопросом, как определить зависимости пакета nuget. Как выясняется, nuget.exe уже делает это на основе package.config, если вы укажете csproj. Кроме того, он извлекает релевантные данные, такие как "Автор", "Версия", "Авторское право" прямо из информации о сборке. Сейчас мне не хватает возможности указать licenseUrl в командной строке. Но я хотел, чтобы этот вопрос был более общим. И поэтому я спрашиваю:

Каков предпочтительный способ упаковки пакетов nuget?

4b9b3361

Ответ 1

Вот малоизвестный факт: вы можете комбинировать оба! Направьте файл csproj и убедитесь, что в одном каталоге есть файл nuspec с тем же именем, что и файл csproj. NuGet объединит их во время создания пакета.

Итак, кратко: target <ProjectName>.csproj, необязательно добавьте соответствующий файл tokenized <ProjectName>.nuspec, который будет использоваться в качестве метаданных NuGet.exe.

Это избавляет вас от управления расположением вывода, зависимостями, версией и другими материалами, которые могут быть получены из проекта.

Ответ 2

Для простых пакетов вы можете напрямую создавать пакеты с .csproj или .vbproj. Но для более продвинутых пакетов, особенно когда вам нужно вытащить пользовательские файлы в свой пакет, вам нужно использовать .nuspec. Обычно я начинаю с csproj и перехожу к nuspec по мере необходимости. Вы всегда можете получить nuspec с помощью команды nuget spec на csproj.

https://docs.nuget.org/create/creating-and-publishing-a-package

Вы можете указать любое из свойств, включая licenseUrl, используя параметр Properties для nuget pack

nuget pack -properties licenseUrl=http://blah

Ответ 3

С .csproj для Visual Studio 2017 вам не нужен файл .nuspec. Фактически вы можете добавлять значения непосредственно к вашему csproj, и он их поднимет.

Щелкните правой кнопкой мыши проект в Visual Studio, Edit xxxxx.csproj. Блокнот отлично работает.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <Version>1.0.1</Version>
    <authors>Subtracts</authors>
    <TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
    <AssemblyName>Checkout.net</AssemblyName>
    <PackageId>Checkout.net</PackageId>

...

</Project>

p.s. Поскольку у меня нет достаточной репутации для комментариев, я оставляю ответ вместо комментария к ответу Ксавьера.:)

Ответ 4

С .NET Core по состоянию на февраль 2018 года вам нужно будет предоставить файл .nuspec для чего-то большего, чем основные свойства файла спецификации.

Но dotnet pack не будет использовать файл .nuspec если вы не добавите <NuspecFile>relative path to nuspec</NuspecFile> в файл .csproj.

См. Https://github.com/dotnet/cli/issues/2170.

Большинство пакетов теперь можно сделать без файла .nuspec. То, что нужно посмотреть, это зависимости. Вам может понадобиться добавить элемент PrivateAssets к некоторым инструментам, таким как msbump и um, например SpecFlow.

<PackageReference Include="msbump" Version="2.3.2">
  <PrivateAssets>all</PrivateAssets>
</PackageReference>

Это останавливает "зависимость" пакета от зависимостей вашего пакета.

Также стоит прочитать об указании версий наиболее гибким способом.

https://docs.microsoft.com/en-us/nuget/consume-packages/dependency-resolution#floating-versions

И синтаксис диапазона.

https://docs.microsoft.com/en-us/nuget/reference/package-versioning#references-in-project-files-packagereference