如何为解决方案中的每个项目创建单独的 nuget 包,并将项目引用转换为 nuget 依赖项?

mat*_*att 5 .net c# visual-studio nuget

我有一个看起来像这样的解决方案。

在此输入图像描述

我想为 ProjA、ProjB 和 ProjC 生成单独的 nuget 包,并且我希望此过程能够检测 ProjC 中上面显示的项目引用,并将它们转换为 nuspec 文件中的 nuget 依赖项,而不仅仅是包含 ProjA 的 dll和 ProjC nuget 包中的 ProjB,这就是当我使用带有 -IncludeReferencedProjects 选项的“nuget pack”命令时发生的情况。

此选项表示自动包含文件或将它们添加为依赖项,但始终包含它们,即使我希望将它们添加为依赖项。奇怪的是,在我的真实解决方案中,项目引用之一总是被添加为依赖项,但其余的则不会,我无法弄清楚其中的区别。

我如何告诉 nuget 将它们添加为依赖项?

我希望引用是项目引用,因为它使开发更容易,而不是每次我想测试时都必须生成更新本地 nuget 包。

Lan*_*SFT 2

但始终包含它们,即使我希望将它们添加为依赖项。我如何告诉 nuget 将它们添加为依赖项?

假设您使用nuget pack命令而不是dotnet packormsbuild /t:pack

对于nuget pack xx.csproj -IncludeReferencedProjects命令,为了确保引用的项目ProjC以格式包含在您的包中nuget dependency,您应该在引用的项目的文件夹中添加相应的文件xx.nuspec文件。

IncludeReferencedProjects 请参阅此处的描述:如果引用的项目有一个.nuspec与该项目同名的对应文件,则该引用的项目将添加为依赖项。否则,引用的项目将作为包的一部分添加

所以这是解决方法:

1.对我来说,我打开cmd.exe并导航到 ProjA 或 ProjB 的项目文件夹,使用nuget sepc命令创建一个ProjectName.nuspec命令在项目文件夹中为我

2.将 的内容更改ProjA.nuspec为如下内容:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>ProjA</id>
    <version>1.0.0</version>
    <title>This is title.</title>
    <authors>This is author.</authors>
    <owners>These are owners.</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>This is description.</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2019</copyright>
  </metadata>
</package>
Run Code Online (Sandbox Code Playgroud)

现在导航到 ProjC 的文件夹并再次打包 ProjC,它将IncludeReferencedProjects按您的预期工作。要检查这一点:将其重命名为ProjC.nupkg,并检查 file.txt中生成的文件ProjC.zip的内容。你会看到类似的东西。ProjC.nuspecProjC.zip<dependency id="ProjA" version="1.0.0" />

此外

1.由于您正在使用nuget pack命令和您的项目目标.net framework,我建议您使用packages.configformat 来管理这三个项目的 nuget 包。

2.为了让你的ProjC添加ProjA和ProjB作为nuget依赖项:除了使用IncludeReferencedProjects+ProjA.nuspec+ProjB.nuspec方式之外,实际上我们可以简单地创建一个ProjC.nuspec文件并添加如下内容来手动定义依赖项。

    <dependencies>
      <dependency id="ProjA" version="1.0.0" />
      <dependency id="ProjB" version="1.0.0" />
    </dependencies>
  </metadata>
Run Code Online (Sandbox Code Playgroud)