【问题标题】:Creating .nupkg from .csproj file in Visual Studio 2017: Properties not updated correctly在 Visual Studio 2017 中从 .csproj 文件创建 .nupkg:属性未正确更新
【发布时间】:2017-11-06 12:31:52
【问题描述】:

我使用 Visual Studio 2017,MSBuild 版本 15.4.8.50001。

我想通过直接从我的.csproj 文件中读取来创建一个.nupkg 文件。按照here 的说明,我将.csproj 文件中的first PropertyGroup 更新为:

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{24BAFE05-8B92-4EAA-8790-03C0768ACC57}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>D</RootNamespace>
    <AssemblyName>D</AssemblyName>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <PackageId>MyCompany.Nuget.D</PackageId>
    <PackageVersion>1.0</PackageVersion>
    <Author>Me</Author>
    <Title>Nuget Experiment Project D</Title>
    <Description>Top-level class in the diamond dependency structure</Description>
  </PropertyGroup>

我打开命令提示符,导航到包含我的.csproj 文件的文件夹,然后运行命令nuget spec,如文档中的here 所述。

但是,生成的 .nuspec 文件如下所示:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2017</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>
</package>

如您所见,我在.csproj 文件中定义的所有属性都没有正确填充到我的.nuspec 文件中。

我做错了什么?

编辑:我最初接受this answer,但现在我认为它不正确。

我将.csproj 文件中的PackageVersion 属性更改为2.0

<PackageVersion>2.0</PackageVersion>

如果正如答案所声称的那样,.nuspec 中的属性确实在打包过程中通过读取我的.csproj 文件进行了更新,则新的.nupkg 文件应具有名称MyCompany.Nuget.D.2.0.0.nupkg

但是,新的.nupkg 文件仍然命名为D.1.0.0.nupkg

编辑:我按照Leo-MSFT's answer 中包含的说明,将AssemblyInfo.cs 文件更改为以下内容:

[assembly: AssemblyTitle("NewD")]
[assembly: AssemblyDescription("Some dummy description")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("MyCompany.Me")]
[assembly: AssemblyProduct("NewD")]
[assembly: AssemblyCopyright("Copyright MyCompany 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("3.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

根据this page$id$是从我的.csproj文件中的AssemblyName字段中检索的,而$version$$author$$description$$copyright$是从AssemblyInfo.cs检索的。为此,我还将.csproj 文件中的AssemblyName 字段更新为MyCompany.NugetTest.D

我导航到包含我的 .sln 文件的文件夹,然后运行 ​​nuget spec "D\D.csproj" as suggested in the answer. The generatednuspec`` 文件如下所示:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>D\D.csproj</id>
    <version>1.0.0</version>
    <authors>Me</authors>
    <owners>Me</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2017</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <dependency id="SampleDependency" version="1.0" />
    </dependencies>
  </metadata>
</package>

我将id 更改为SuperUniqueD,然后运行nuget pack D.csproj。然后创建了包D.3.0.0.nupkg

为什么包仍然命名为D?如果值是从.csproj 文件中的AssemblyName 字段读取的(根据文档),它是否应该命名为MyCompany.NugetTest.D,或者如果它是从AssemblyInfo.cs 读取的,则不应该命名为NewD

【问题讨论】:

  • 这个问题有什么更新吗?你的问题解决了吗?如果没有,请告诉我有关此问题的最新信息。
  • @Leo-MSFT 您好,感谢您的回复。不幸的是,我昨天没有机会测试您的解决方案,因为我病了,没有去上班。我今天将测试您的解决方案并尽快更新。 :-)
  • @Leo-MSFT 我已经测试了您的解决方案,但不幸的是结果并不完全符合我的期望。我已经用我的最新结果更新了我的问题。我误解了你的任何指示吗?
  • 您在哪里将Id 更改为SuperUniqueD?您应该在项目文件中更改它。我已经用更详细的信息更新了我的答案,你可以检查它是否对你有帮助。

标签: c# msbuild nuget visual-studio-2017 nuget-package


【解决方案1】:

我在 .csproj 文件中定义的所有属性都没有正确填充到我的 .nuspec 文件中。我做错了什么?

因为您导航到包含您的 .csproj 文件的文件夹,您应该导航到包含您的 .sln 文件的文件夹 或在您的命令中包含完整路径而不使用导航,命令如下:

  1. 导航到解决方案文件夹:

    C:\Workspaces\NuGet Experimentation\D&gt;nuget spec "D\D.csproj"

  2. 没有导航:

    C:\Users\Admin&gt;nuget spec "C:\Workspaces\NuGet Experimentation\D\D\D.csproj"

$&lt;token&gt;$ 形式的标记在打包过程中被项目的Properties/AssemblyInfo.cs 文件中的值替换。此文件的设置信息包含在.sln 文件中。如果导航到包含 .csproj 文件的文件夹,NuGet 找不到 AssemblyInfo.cs 的位置,因此 NuGet 将使用默认值 $&lt;token&gt;$ 而不是 AssemblyInfo.cs 文件中的值。使用上述方法,您将获得.nuspec 文件,如:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>C:\Workspaces\NuGet Experimentation\D\D\D.csproj</id>
    <version>1.0.0</version>
    <authors>Admin</authors>
    <owners>Admin</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2017</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <dependency id="SampleDependency" version="1.0" />
    </dependencies>
  </metadata>
</package>

为了选择一个在 nuget.org 中唯一的包 ID,您还需要手动修改 .nuspec 的 Id。有关更多详细信息,请参阅Create the .nuspec package manifest file

对于编辑问题:

但是,新的 .nupkg 文件仍命名为 D.1.0.0.nupkg。

就像回答第一个问题“在打包过程中,$$ 形式的标记将被项目的 Properties/AssemblyInfo.cs 文件中的值替换。 "

所以如果你想生成带有更新版本的包,你应该更新AssemblyInfo.cs文件中的Assembly Version,然后使用pack命令行生成nuget包:nuget pack xx.csproj

有关令牌的更多信息,请参阅Replacement tokens

编辑更新

我将 id 更改为 SuperUniqueD,然后运行 ​​nuget pack D.csproj。包裹 然后创建了 D.3.0.0.nupkg。

由于您使用的是命令:nuget pack D.csproj,因此您应该更改项目文件中的 Id 而不是 .nuspec 文件:

如果你更改了.nuspec中的Id,你应该用.nuspec文件打包:nuget pack D.csproj.nuspec

【讨论】:

  • 感谢您的更新。正如我在更新中提到的,我将.csproj 中的AssemblyName 更改为MyCompany.NugetTest.D,但生成的.nupkg 文件没有这样命名...
  • @MY_G,一头雾水。您说您将id 更改为SuperUniqueD,现在您将.csproj 中的AssemblyName 更改为MyCompany.NugetTest.D,您实际上在做什么?生成包的名称是什么?如果您仍然无法解决您的问题,您可以与我分享 gif 或视频以获取详细信息。顺便说一句,尝试更新 nuget.exe 版本。
  • 您好,我已将AssemblyName 更改为SuperUniqueD,以与我的nuspec 文件保持一致。所以现在both D.csproj 中的AssemblyNamenuspec 文件中的idSuperUniqueD。我也在使用nuget.exe 的最新稳定版本。现在生成的.nupkg 具有名称SuperUniqueD,正如预期的那样。但是,它的版本号仍然是1.0.0,尽管我已经在我的AssemblyInfo.cs 文件中将AssemblyVersion 更新为3.0.0.0...
  • @MY_G,你可以打包 .nuspec 文件,.nuspec 文件有一点问题。如果您将 AssemblyVersion 更新为 3.0.0.0,那么您生成的 .nuspec 文件仍然是 1.0.0 版本,您需要手动将 &lt;version&gt;1.0.0&lt;/version&gt; 更改为 &lt;version&gt;3.0.0&lt;/version&gt;。或者你可以直接把AssemblyVersion改成3.0.0.0后打包D.csproj。顺便说一句,顺便说一句,我的回答是否解决了您的问题,如果是,您可以将其标记为答案,这样可以帮助遇到相同问题的其他社区成员。谢谢。
【解决方案2】:

.nuspec 文件中的属性确实是根据您的.csproj 文件属性更新的。但是,在这种情况下有一个例外。从项目生成 NuGet 包时,NuGet 包的版本对应于Assembly Version。因此,如果在您的项目中,您打开AssemblyInfo.cs 文件并将Assembly Version1.0.0.0 更新为2.0.0.0 并构建项目,在nuspec pack 上生成的结果包将具有版本名称2.0.0.

【讨论】:

    【解决方案3】:

    我认为这是正确的 nuspec 属性。

    $id$ 和其他标记在打包时将替换为 .csproj 文件中的值。

    【讨论】:

    • 您好,感谢您的回复。不幸的是,由于我的更新中给出的原因,我不得不不接受你的回答。
    • 好吧。没问题。
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2017-08-08
    • 2017-08-06
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多