Nuspec中的依赖项与csproj中的有何不同?

10

我有一个Dotnet Core 2.1项目,其中包含一个nuspec和一个csproj文件 - 其中一个主要的麻烦是csproj这样描述依赖关系:

  <ItemGroup>
    <PackageReference Include="Refit" Version="4.6.16" />
      <PackageReference Include="Microsoft.AspNetCore.All" Version="2.1" />
      <PackageReference Include="Refit.HttpClientFactory" Version="4.6.16" />   
  </ItemGroup>

虽然nuspec会做这个:

 <dependencies>
      <dependency id="Refit" version="4.6.16" />
      <dependency id="Refit.HttpClientFactory" version="4.6.16" />
      <dependency id="Microsoft.AspNetCore.All" version="2.1" />
    </dependencies>

两者很容易不同步,而且重复相同的信息非常烦人。有没有办法避免这种情况?


我认为你应该将@Alsein的答案标记为已接受。 - Kishan Vaishnav
1个回答

11
一定有一种简单的方法来做到这一点,只需使用 dotnet pack 替代 nuget pack,并使用 .csproj 文件替代 .nuspec 文件。 dotnet pack 支持两种指定 NuGet 包属性的方式:
  1. 旧的方式:使用 .nuspec 文件,将禁用第二种方式。
  2. 新的方式:在.csproj 文件中指定它们
dotnet pack 支持两种方式,但必须添加 NuspecFile 属性来引用 .nuspec 文件。而且旧的方式存在许多错误和功能缺失,这意味着您只能使用新的方式。 dotnet pack 在项目上执行还原和构建,并使用自动生成的 .nuspec 文件打包,将所有 NuGet 元数据属性解析为 .nuspec 属性,并将所有项目引用解析为 NuGet 包引用(手动指定的 .nuspec 文件不支持此功能),以便可以自动确保版本控制、依赖关系和包文件结构等内容。

我的自己的库可以作为一个例子。版本和依赖项只在它们应该出现的地方指定一次,再也没有令人讨厌的重复配置了。在解决方案目录上执行dotnet pack将在dist目录中生成所有良好的.nupkg


1
非常感谢! 您知道如何将nuspec文件中的References替换为csproj文件吗? 这些是我们使用nuspec的唯一原因:<references> <group targetFramework="netcoreapp2.1"> <reference file="service.contracts.dll" /> // 由解决方案中的另一个项目构建的dll <reference file="service.client.dll" /> // 由csproj生成的主要dll </group> </references> - Christian Sauer
不建议直接引用dll文件。至于项目引用,它们将被转换为NuGet包引用而无需其他规定。对于每个您没有源项目的程序集,如果在NuGet上有包,请使用它,否则您将不得不自己打包并将其上传到nuget.org或您自己的NuGet服务器以保持私密性。 - Alsein

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