【问题标题】:Set custom ID for a NuGet package without using .nuspec在不使用 .nuspec 的情况下为 NuGet 包设置自定义 ID
【发布时间】:2020-02-27 07:46:54
【问题描述】:

我需要使用命令行自定义名称将我的 Visual Studio C# 库发布到 NuGet。

据我所知,只有一种方法可以做到这一点 - 使用 .nuspec 文件并指定 ID。这是我不想做的,因为我必须在每次项目更改时手动修复文件。我也找不到从.cproj 文件生成.nuspec(带有依赖项)的工具。

我一直在寻找 nuget pack 选项,但只找到了似乎没有完成这项工作的 -Properties

【问题讨论】:

  • 切换到基于SDK的工程格式,当然需要VS2017及以上版本。
  • @LexLi 没有真正关注你。我不能触摸解决方案/项目本身,我只能对 nuget 命令做一些事情。

标签: visual-studio nuget


【解决方案1】:

我也找不到生成 .nuspec 的工具(使用 依赖项)来自 .cproj 文件。

据我所知,没有简单的工具(nuget spec 命令不支持这样做)来生成带有来自xx.csproj 的包依赖项的.nuspec。而且由于你的实际问题是Set custom ID for a NuGet package **without** using .nuspec,所以这里就不讲如何生成和修改了。

我一直在寻找 nuget pack 选项,但只找到 - 似乎无法胜任的物业。

我假设您正在使用使用 PackageReference 格式的 .net framework 项目。由于您不愿意使用.nuspec 文件,因此您必须使用nuget pack xx.csprojnuget pack(在csproj 存在的地方运行此命令)命令。

但据我所知,还有一个known issue nuget pack 不会显示依赖项,当将此命令用于使用 PackageReference 格式的项目时。是的,nuget pack -Properties 无法满足您对当前项目类型的需求。所以这不是一个好的选择。

在不使用 .nuspec 的情况下为 NuGet 包设置自定义 ID

建议您的原始问题:

由于您不想使用 .nuspec 文件,nuget pack 不适合您的情况。要创建 nuget 包,nuget.exe 不是您唯一的选择。也可以考虑dotnet CLIMSBuild.exe

1。您可以选择从non-SDK format to new SDK format更改您的项目,然后您可以specify the ID in project file(.csproj),您不再需要.nuspec。另外,迁移后,将支持在命令行中指定ID

因此您可以使用类似dotnet pack -p:PackageID=TestName 的命令在命令行中轻松指定ID(或其他包元数据)。 (对于sdk格式,也可以使用msbuild.exe

2。如果您不想将当前项目格式更改为SDK format,可以关注this topic如果您使用的是非 SDK 的 MSBuild-样式项目和 PackageReference,将 NuGet.Build.Tasks.Pack 包添加到您的项目中。

使用该包,然后使用命令msbuild -t:restore 在命令行中恢复 nuget 包。然后使用msbuild -t:pack -p:PackageID=xxx之类的命令在命令行中指定ID。(或在xx.csproj中设置该ID)

【讨论】:

  • 嗨兰斯,感谢您的回复。我会仔细阅读并尝试。顺便说一句,如果我可以让 MSBuild 使用不同的程序集名称构建我的项目,然后将其提供给 NuGet 等,那将是一个不错的选择。但是当我设置 /p:AssemblyName=NewAssemblyName 时,我会收到“错误 CS1704:具有相同简单名称的程序集...已经被导入”,因为 MSBuild 也将 NewAssemblyName 应用于 所有 引用的项目。有没有办法只让主项目有不同的名字?
  • 我可以想象两种可能的方式:1.使用构建后的目标来修改名称,而不是在命令行中使用AssemblyName指定它(只是一种可能的方式,还没来得及测试) 2.修改Main项目的项目文件,假设我们有一个名为TestPro的项目,默认设置为<RootNamespace>TestPro</RootNamespace> <AssemblyName>TestPro</AssemblyName>,修改为<RootNamespace>TestPro</RootNamespace> <CustomName>$(RootNamespace)</CustomName> <AssemblyName>$(CustomName)</AssemblyName>。然后在命令中使用 /p:CustomName 指定 main 的 assemblyName。
  • @LINQ2Vodka 我没有测试过这种情况...让我现在检查一下,如果我有任何更新会稍后回复:-)
  • @LINQ2Vodka 您好,我做了一些测试,确认对于带有 packages.config 的非 sdk 项目,我们只能使用 nuget pack 命令。(使用 msbuild 和 dotnet cli 打包不支持包。 config)=>要使用 nuget pack 指定 ID,我们必须使用 xx.nuspec...(我想更改输出程序集的名称对您来说不是一个好选择)。所以现在我们被困在这里,恐怕你想要的不是一个受支持的场景。
  • #2. 所以我们可能不得不使用 xx.nuspec 文件,或者 migrate packages.config to packagereference 使用 VS2017 或 VS2019 UI。 3.你改变ID的特殊原因是什么,如果你只是想自动化重命名生成的nuget包的过程,有更简单的方法来做到这一点。如果您尝试更改包名称中的 ID 和 xx.nupkg 中的 xx.nuspec 的名称,请考虑 #2... 抱歉,您的回答是否定的 :(
猜你喜欢
  • 2011-10-19
  • 2014-12-02
  • 1970-01-01
  • 2015-10-13
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多