Пакет nuget не читает версию сборки из проекта Visual Studio

Я следую этот официальный документ о создании пакета nuget с помощью nuget.exe. Я пытаюсь создать файл nuspec из проекта Visual Studio.

Согласно документам, когда вы запускаете

> nuget spec

Из каталога, в котором находится ваш файл .csproj, он создает токенизированный файл .nuspec. Затем при запуске nuget pack <project-name>.csproj значения из файла проекта используются для замены токенов в файле nuspec.

Итак, в моем примере у меня есть проект под названием Logger1. После запуска nuget spec у меня есть следующее .nuspec

<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>Yoav Klein</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <license type = "expression">MIT</license>
...

Теперь этот документ говорит, что:

To use these tokens, run nuget pack with the project file rather than just the .nuspec. For example, when using the following command, the $id$ and $version$ tokens in a .nuspec file are replaced with the project's AssemblyName and AssemblyVersion values:

nuget pack MyProject.csproj

Моя версия сборки:

# AssemblyInfo.cs

// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.6.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Теперь я запускаю nuget pack Logger1.csproj и ожидаю, что версия пакета будет взята из AssemblyVersion проекта, как и обещано документами.

После создания пакета я изучаю файл .nuspec в созданном пакете:

<package xmlns = "http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>Logger1</id>
    <version>1.0.0</version>

Как видите, по какой-то причине он не принимает правильное значение AssemblyVersion, равное 1.6.0, а всегда использует значение 1.0.0.

Может кто-нибудь сказать мне, что я делаю неправильно?

Версия NuGet: 5.8.1.7021


Просто для подтверждения, после сборки dll я вижу, что версия сборки 1.6.0:

PS> [Reflection.AssemblyName]::GetAssemblyName("$(pwd)\bin\Debug\Logger1.dll")

Version        Name
-------        ----
1.6.0.0        Logger1

Я не уверен, но знаете ли вы разницу между AssemblyVersion, File version и Package version? На самом деле, если вы хотите подтвердить, изменился ли AssemblyVersion, вы можете установить этот упакованный пакет NuGet в проект и собрать проект. Проект создаст файл .dll, связанный с этим пакетом NuGet, и обычно он хранится в ..\bin\Debug. Вы можете открыть PowerShell и ввести команду, например [Reflection.AssemblyName]::GetAssemblyName("full path to this dll file").Version, и вы увидите AssemblyVersion.

Tianyu 18.03.2022 08:16

Но, возможно, вы просто хотите изменить Версия файла/версия пакета? Я думаю :D

Tianyu 18.03.2022 08:17

@Tianyu, см. редактирование

YoavKlein 18.03.2022 09:25

Я немного запутался, я думал, что вы хотите изменить версию сборки, но, похоже, это не то, что вы хотите. Ты имеешь в виду, что хочешь измениться 1.0.0? И в подтверждение, где вы это видели 1.0.0?

Tianyu 18.03.2022 09:57

@Tianyu, взгляни на редактирование еще раз. Надеюсь, на этот раз достаточно ясно

YoavKlein 18.03.2022 12:42

Спасибо за разъяснение, могу я спросить, где вы нашли созданный файл .nuspec, когда пытались его изучить? Это тот же файл .nuspec, который был создан командой nuget spec и изменен командой nuget pack MyProject.csproj? Так как, проверено на моей стороне, после запуска команды pack я не увидел, что мой файл .nuspec был изменен (они все еще $id$, $version$).

Tianyu 21.03.2022 09:08

@Tianyu, исходный файл nuspec не должен меняться. Файл .nuspec, о котором я говорю, содержится в созданном .nupkg.

YoavKlein 24.03.2022 18:18

Я понял, смотрите мой ответ ниже.

Tianyu 25.03.2022 08:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта проблема выглядит как потенциальная проблема.

Я сделал больше тестов и, проанализировав, увидел, что в процессе упаковки всегда появлялось сообщение об ошибке, например XXXXX is required. Я подтвердил несколько раз и сослался на официальные документы, в котором упоминалось, что токены будут заменены на значение, установленное в моем AssemblyInfo.cs файле.

Например, если я установил [assembly: AssemblyCompany("Company")], как и обещал, токен $author$ должен быть заменен на «Компания», но он не был заменен, вместо этого он сообщил об ошибке Authors is required , которая выглядит так, как будто nuget.exe не проверил мой AssemblyInfo.cs файл на все.

Затем я нашел эту тему: NuGet снова выдает исключения «требуются авторы»… игнорируя токены замены csproj/nuspec. И я видел один обходной путь/решение> назовите загруженный файл nuget.exe файлом nuget.exe и щелкните файл правой кнопкой мыши> свойство> установите флажок Unblock рядом с сообщением This file came from another computer and might be blocked to help protect this computer.. И кажется, это решение, и пусть nuget.exe нормально работает, чтобы найти и проверить файл AssemblyInfo.cs, а затем заменить токены.

Короче говоря (все решение)

Загрузите nuget.exe с официального сайта и убедитесь, что его имя nuget.exe. Затем щелкните правой кнопкой мыши файл nuget.exe и выберите «Свойства». Перейдите на вкладку «Общие», отметьте опцию Unblock. Перейдите в папку проекта, сначала очистите кеш проекта (удалите папки bin, obj, закройте свое решение в VS и удалите скрытую папку .vs, удалите файл .nuspec и файл .nupkg), а затем используйте nuget.exe spec в командной строке для создания нового .nuspec файл, отредактируйте его как хотите. После этого запустите командную строку nuget.exe pack yourproject.csproj, чтобы упаковать пакет NuGet.

Короче (причина)

На мой взгляд скачанный файл nuget.exe заблокирован.

@Tiaynu, молодец!

YoavKlein 25.03.2022 09:48

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