Я следую этот официальный документ о создании пакета 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
Но, возможно, вы просто хотите изменить Версия файла/версия пакета? Я думаю :D
@Tianyu, см. редактирование
Я немного запутался, я думал, что вы хотите изменить версию сборки, но, похоже, это не то, что вы хотите. Ты имеешь в виду, что хочешь измениться 1.0.0
? И в подтверждение, где вы это видели 1.0.0
?
@Tianyu, взгляни на редактирование еще раз. Надеюсь, на этот раз достаточно ясно
Спасибо за разъяснение, могу я спросить, где вы нашли созданный файл .nuspec, когда пытались его изучить? Это тот же файл .nuspec
, который был создан командой nuget spec
и изменен командой nuget pack MyProject.csproj
? Так как, проверено на моей стороне, после запуска команды pack
я не увидел, что мой файл .nuspec был изменен (они все еще $id$
, $version$
).
@Tianyu, исходный файл nuspec не должен меняться. Файл .nuspec, о котором я говорю, содержится в созданном .nupkg.
Я понял, смотрите мой ответ ниже.
Эта проблема выглядит как потенциальная проблема.
Я сделал больше тестов и, проанализировав, увидел, что в процессе упаковки всегда появлялось сообщение об ошибке, например 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, молодец!
Я не уверен, но знаете ли вы разницу между
AssemblyVersion
,File version
иPackage version
? На самом деле, если вы хотите подтвердить, изменился лиAssemblyVersion
, вы можете установить этот упакованный пакет NuGet в проект и собрать проект. Проект создаст файл.dll
, связанный с этим пакетом NuGet, и обычно он хранится в..\bin\Debug
. Вы можете открыть PowerShell и ввести команду, например[Reflection.AssemblyName]::GetAssemblyName("full path to this dll file").Version
, и вы увидитеAssemblyVersion
.