NuGet包中的PackageReference使用props和targets。

4

我想创建一个包含 .props 文件的 NuGet 包。

.props 文件的内容如下:

<Project>
  <ItemGroup>
    <PackageReference Include="GitVersion.Tool" Version="[5.1.1]" PrivateAssets="All" ExcludeAssets="All" />
    <PackageReference Include="dotnet-sonarscanner" Version="[4.7.1]" PrivateAssets="All" ExcludeAssets="All" />
    <PackageReference Include="ReportGenerator" Version="[4.4.6]" PrivateAssets="All" ExcludeAssets="All" />
    <PackageReference Include="NuGet.CommandLine" Version="[5.4.0]" PrivateAssets="All" ExcludeAssets="All" />
    <PackageReference Include="CycloneDX" Version="[0.9.0]" PrivateAssets="All" ExcludeAssets="All" />
    <PackageReference Include="trx2junit" Version="[1.3.0]" PrivateAssets="All" ExcludeAssets="All" />
  </ItemGroup>

  <ItemGroup>
    <NukeSpecificationFiles Include="**\*.json" Exclude="bin\**;obj\**" />
    <NukeExternalFiles Include="**\*.*.ext" Exclude="bin\**;obj\**" />
    <None Remove="*.csproj.DotSettings;*.ref.*.txt" />

    <!-- Common build related files -->
    <None Include="..\build.ps1" />
    <None Include="..\build.sh" />

    <None Include="..\.nuke" LinkBase="config" />
    <None Include="..\global.json" LinkBase="config" Condition="Exists('..\global.json')" />
    <None Include="..\nuget.config" LinkBase="config" Condition="Exists('..\nuget.config')" />
    <None Include="..\GitVersion.yml" LinkBase="config" Condition="Exists('..\GitVersion.yml')" />
    <None Include="..\CODEOWNERS" LinkBase="config" Condition="Exists('..\CODEOWNERS')" />

    <None Include="..\.teamcity\settings.kts" LinkBase="ci" Condition="Exists('..\.teamcity\settings.kts')" />
    <None Include="..\.github\workflows\*.yml" LinkBase="ci" />
    <None Include="..\azure-pipelines.yml" LinkBase="ci" Condition="Exists('..\azure-pipelines.yml')" />
    <None Include="..\Jenkinsfile" LinkBase="ci" Condition="Exists('..\Jenkinsfile')" />
    <None Include="..\appveyor.yml" LinkBase="ci" Condition="Exists('..\appveyor.yml')" />
    <None Include="..\.gitlab-ci.yml" LinkBase="ci" Condition="Exists('..\.gitlab-ci.yml')" />
    <None Include="..\.travis.yml" LinkBase="ci" Condition="Exists('..\.travis.yml')" />
  </ItemGroup>
</Project>

在将nuget打包并推送到feed后,该nuget会被其他项目使用,这些项目可以正常工作。

消费项目会解释.props和全部条件文件,并添加PackageReferences。

当我使用VS2019构建项目时,一切正常。但是当我使用dotnet build构建时,来自.props文件的PackageReferences不会被添加。

我检查了project.assets.json,它们是不同的。VS2019将工具添加到资产文件:

...
"CycloneDX/0.9.0": {
  "type": "package"
},
"dotnet-sonarscanner/4.7.1": {
  "type": "package"
},
"GitVersion.Tool/5.1.1": {
  "type": "package"
},
...

但dotnet build没有将其添加。

是否需要在dotnet restore命令中添加属性或标志?或者您有任何关于不同行为的想法。

我的目标是,使用这些项目的其他项目将dotnet工具作为私有资源包含在其项目中。

2个回答

1

我发现了解决您问题的方法,因为我也曾经遇到过同样的问题。

解决方案

提供 NuGet 包作为包引用,并以传递方式使用它们。 为此,您可以将 PrivatAssets 设置为 None 以包括所有资产(或者取决于您想要传递提供的内容,但编译和运行时应该是其中的一部分)。还可以查看 控制依赖项资产 获取详细信息。

您的 .csproj 将包含以下声明:

<Project Sdk="Microsoft.NET.Sdk">
  
  <ItemGroup>
<PackageReference Include="GitVersion.Tool" Version="[5.1.1]" PrivateAssets="None" />
<PackageReference Include="dotnet-sonarscanner" Version="[4.7.1]" PrivateAssets="None" />
<PackageReference Include="ReportGenerator" Version="[4.4.6]" PrivateAssets="None" />
<PackageReference Include="NuGet.CommandLine" Version="[5.4.0]" PrivateAssets="None" />
<PackageReference Include="CycloneDX" Version="[0.9.0]" PrivateAssets="None" />
<PackageReference Include="trx2junit" Version="[1.3.0]" PrivateAssets="None" />
  </ItemGroup>

  <ItemGroup>
    <None Include="build\YourPackage.props" Pack="true" PackagePath="build\" />
  </ItemGroup>
</Project>

你对应的 YourPackage.props 文件看起来像之前,但是没有引用。

然后你的消费项目可以简单地引用 YourPackage(并可选地控制应该被消费的内容):

<PackageReference Include="YourPackage" Version="x.y" /> 

问题的详细说明

我也想通过NuGet包导入PackageReferences,在Visual Studio本地构建时可以正常工作。但是,在我们运行dotnet build的构建服务器上没有导入包引用(在本地也无法使用dotnet build)。

经过一些研究,我偶然发现了这个MSBuild props和targets内容的指南,具体如下:

有一些必须不要在packages的.props和.targets中执行的操作,例如不指定影响还原的属性和项,因为这些将被自动排除。

  • ...
  • 一些不得添加或更新的示例:PackageReference、PackageVersion、PackageDownload等
这在某种程度上是有道理的,因为NuGet提供的.props/.targets文件是通过restore导入的,并提供了需要在完全相同的步骤中处理的引用。我怀疑dotnet restore根本无法处理这个问题。(这也解释了为什么我需要在Visual Studio中构建两次才能让它正常工作。)

0

没有标志。您需要使用dotnet pack代替。


这并没有提供问题的答案。如果要对作者进行批评或请求澄清,请在他们的帖子下留言。-【来自审查】 - Azametzin
这样好一点吗? - coderpatros
你遇到了这个确切的问题,你找到解决方案了吗? - user10285265

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接