无法使用 dotnet CLI 和 nuspec 文件打包 NuGet 包
Unable to pack a NuGet package using dotnet CLI and nuspec file
我有几个项目要从 .NET Framework 4.7 迁移到 .NET Standard 2.0。因此,我尝试使用 dotnet pack
命令创建我的 NuGet 包,同时使用带有标记的 nuspec
文件。我有几个自定义构建脚本可以为我生成版本号。我生成的文件不是版本控制的一部分,但 nuspec
文件是我想尝试找到一种方法让令牌工作的原因,否则我将不得不编写新脚本。
我做的第一件事是在项目文件中将 GenerateAssemblyInfo
设置为 false。在我最简单的项目中,csproj
文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
然后我有一个 AssemblyInfo.cs
作为构建过程的一部分生成。在我编译项目之前,文件看起来像这样:
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Company Name")]
[assembly: AssemblyCopyright("Copyright © 2019")]
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyTitle("The Title")]
[assembly: AssemblyDescription("The Description")]
[assembly: AssemblyProduct("The Product")]
[assembly: ComVisible(false)]
[assembly: Guid("48d6ef54-a8fb-4876-8a9a-2fb8e8cd27e7")]
[assembly: AssemblyVersion("6.0.0.0")]
[assembly: AssemblyFileVersion("6.0.0.0")]
然后我有一个 .nuspec
文件,我用它来创建我的 NuGet 包,如下所示:
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>My name</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>My Release Notes</releaseNotes>
<copyright>Copyright 2019</copyright>
<projectUrl>http://url.local</projectUrl>
</metadata>
</package>
经过大量阅读(不是曾经为 .NET Core 编写过新文档的人的粉丝)我相信这是我需要 运行 才能使用我的 nuspec
文件的命令:
dotnet pack SubFolder\MyProject.Model.csproj /p:NuspecFile=MyProject.Model.nuspec /p:NuspecBasePath=nuget
结果是这个错误:
NuGet.Build.Tasks.Pack.targets(202,5): error : An error occured while
trying to parse the value '' of property 'version' in the manifest
file. [F:\Git\MyProject\Model\MyProject.Model\MyProject.Model.csproj]
NuGet.Build.Tasks.Pack.targets(202,5): error : Value cannot be null
or an empty string.
[F:\Git\MyProject\Model\MyProject.Model\MyProject.Model.csproj]
NuGet.Build.Tasks.Pack.targets(202,5): error : Parameter name: value
[F:\Git\MyProject\Model\MyProject.Model\MyProject.Model.csproj]
根据输出,很明显底层目标文件没有从我的 AssemblyInfo.cs
中获取值,而是试图直接从 csproj
文件中获取值.因此,我尝试简化流程并 运行 此命令:dotnet pack MyProject.Model\MyProject.Model.csproj
创建了我的 NuGet 程序包,但我的 nuspec
或 AssemblyInfo.cs
文件中没有元数据。
我从 dotnet-cli
和 NuGet
项目中阅读了很多关于 GitHub 的未解决问题,这些问题似乎与我正在经历的类似,但是 none 他们给了我一个有效的解决方案。有没有其他人认为这是一个错误或者我遗漏了什么?
我有同样的问题,并按照此处的建议通过将 <NuspecProperties>
添加到 csproj 来解决它:https://github.com/NuGet/Home/issues/6636
<NuspecFile>package.nuspec</NuspecFile>
<NuspecProperties>$(NuspecProperties);configuration=$(Configuration)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);version=$(Version)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);id=$(PackageId)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);author=$(Authors)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);PackageProjectUrl=$(PackageProjectUrl)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);Description=$(Description)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);PackageReleaseNotes=$(PackageReleaseNotes)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);Copyright=$(Copyright)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);PackageTags=$(PackageTags)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);RepositoryType=$(RepositoryType)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);RepositoryUrl=$(RepositoryUrl)</NuspecProperties>
我有几个项目要从 .NET Framework 4.7 迁移到 .NET Standard 2.0。因此,我尝试使用 dotnet pack
命令创建我的 NuGet 包,同时使用带有标记的 nuspec
文件。我有几个自定义构建脚本可以为我生成版本号。我生成的文件不是版本控制的一部分,但 nuspec
文件是我想尝试找到一种方法让令牌工作的原因,否则我将不得不编写新脚本。
我做的第一件事是在项目文件中将 GenerateAssemblyInfo
设置为 false。在我最简单的项目中,csproj
文件如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
然后我有一个 AssemblyInfo.cs
作为构建过程的一部分生成。在我编译项目之前,文件看起来像这样:
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Company Name")]
[assembly: AssemblyCopyright("Copyright © 2019")]
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyTitle("The Title")]
[assembly: AssemblyDescription("The Description")]
[assembly: AssemblyProduct("The Product")]
[assembly: ComVisible(false)]
[assembly: Guid("48d6ef54-a8fb-4876-8a9a-2fb8e8cd27e7")]
[assembly: AssemblyVersion("6.0.0.0")]
[assembly: AssemblyFileVersion("6.0.0.0")]
然后我有一个 .nuspec
文件,我用它来创建我的 NuGet 包,如下所示:
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>My name</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>My Release Notes</releaseNotes>
<copyright>Copyright 2019</copyright>
<projectUrl>http://url.local</projectUrl>
</metadata>
</package>
经过大量阅读(不是曾经为 .NET Core 编写过新文档的人的粉丝)我相信这是我需要 运行 才能使用我的 nuspec
文件的命令:
dotnet pack SubFolder\MyProject.Model.csproj /p:NuspecFile=MyProject.Model.nuspec /p:NuspecBasePath=nuget
结果是这个错误:
NuGet.Build.Tasks.Pack.targets(202,5): error : An error occured while trying to parse the value '' of property 'version' in the manifest file. [F:\Git\MyProject\Model\MyProject.Model\MyProject.Model.csproj]
NuGet.Build.Tasks.Pack.targets(202,5): error : Value cannot be null or an empty string. [F:\Git\MyProject\Model\MyProject.Model\MyProject.Model.csproj]
NuGet.Build.Tasks.Pack.targets(202,5): error : Parameter name: value [F:\Git\MyProject\Model\MyProject.Model\MyProject.Model.csproj]
根据输出,很明显底层目标文件没有从我的 AssemblyInfo.cs
中获取值,而是试图直接从 csproj
文件中获取值.因此,我尝试简化流程并 运行 此命令:dotnet pack MyProject.Model\MyProject.Model.csproj
创建了我的 NuGet 程序包,但我的 nuspec
或 AssemblyInfo.cs
文件中没有元数据。
我从 dotnet-cli
和 NuGet
项目中阅读了很多关于 GitHub 的未解决问题,这些问题似乎与我正在经历的类似,但是 none 他们给了我一个有效的解决方案。有没有其他人认为这是一个错误或者我遗漏了什么?
我有同样的问题,并按照此处的建议通过将 <NuspecProperties>
添加到 csproj 来解决它:https://github.com/NuGet/Home/issues/6636
<NuspecFile>package.nuspec</NuspecFile>
<NuspecProperties>$(NuspecProperties);configuration=$(Configuration)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);version=$(Version)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);id=$(PackageId)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);author=$(Authors)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);PackageProjectUrl=$(PackageProjectUrl)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);Description=$(Description)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);PackageReleaseNotes=$(PackageReleaseNotes)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);Copyright=$(Copyright)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);PackageTags=$(PackageTags)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);RepositoryType=$(RepositoryType)</NuspecProperties>
<NuspecProperties>$(NuspecProperties);RepositoryUrl=$(RepositoryUrl)</NuspecProperties>