繁体   English   中英

在一个解决方案中从多个项目创建一个 NuGet package

[英]Creating one NuGet package from multiple projects in one solution

我有一个我正在研究的解决方案,其中包含 4 个 class 库项目( ABCD )。 AB可以被认为是解决方案中的顶级项目。 AB都参考C ,而D独立。

这四个项目代表了我制作的一组处理自动化工作流的服务。 它们都是密切相关的,并且只会在一个位置(服务管理器)中使用,所以我不想将它们分成不同的解决方案。

我的问题是我想创建一个包含所有 4 个库的 NuGet package,而无需构建它们并手动收集它们的 DLL。 我知道在技术上我可以通过让AB引用其余项目来实现这一点,但这不是真正的关系,我认为应该避免这种关系。

我对这个问题进行了很多搜索,除了手动收集 DLL 并自己构建 package 之外,我找不到其他解决方案。 有没有办法使用 NuGet 的特性/能力来实现我想要的结果?

注意:如果标签不明确,我目前正在将 VS2010 与 TeamCity 构建服务器一起使用。 如果它是相关的,我还通过 Stash 服务器使用 Git。

编辑:我刚刚意识到这可能很重要。 这些项目确实引用了我需要标记为依赖项的其他 NuGet 包。

您必须定义自己的 nuspec 清单。 您可以在files部分列出包含程序集:

<file src="A\bin\Release\A.dll" target="lib\net40" />
<file src="B\bin\Release\B.dll" target="lib\net40" />
...

有关更多详细信息,请阅读NuSpec 参考

然后在 NuPack 构建步骤而不是 proj 中引用该 nuspec 文件。

如果您已下载NuGet.exe您可以运行: nuget pack Myproject.csproj -IncludeReferencedProjects这应该包括您的所有项目。 这是 NuGet 文档中的注释:

如果项目引用了其他项目,您可以将引用的项目添加为包的一部分,或者使用 -IncludeReferencedProjects 选项作为依赖项添加。 这是递归完成的。 例如,假设您有项目 A.csproj,它引用 B.csproj 和 C.csproj,而 B.csproj 引用 D.csproj & E.csproj,C.csproj 引用 F.csproj & G.csproj。 然后,当您运行时:

nuget pack A.csproj -IncludeReferencedProjects

生成的包将包含来自项目 B、C、D、E、F 和 G 的文件,以及来自项目 A 的文件。

如果引用的项目具有相应的同名 nuspec 文件,则将该引用的项目添加为依赖项。 使用相同的示例,假设现在在与项目文件 C.csproj 相同的目录中有文件 C.nuspec。 当你运行时:

nuget pack A.csproj -IncludeReferencedProjects

生成的包将包含来自项目 B、D、E 的文件,以及来自项目 A 的文件,并且该包依赖于 C。

另请参阅命令行参考

2020 更新

我个人更喜欢尽可能使用dotnet命令。

我发现工作正常的解决方案是更改主项目<ProjectReference></ProjectReference>的默认项目引用,如下所示

  <ItemGroup>
    <ProjectReference Include="..\{ProjectFolder}\{ProjectName}.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>{ProjectName}.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup> 

此解决方案已确认在针对netstandard2.0及更高版本时有效。

这可能会解决这个问题:nuget.exe pack proj.csproj -IncludeReferencedProjects

您可以看到: 为具有多个项目的解决方案创建 nuget 包

如果您在 VS 中有多个项目并且您的 Pack 文件依赖于另一个项目,则两者都需要打包。 先打包依赖,然后打包你的项目。 使用 NuGet 包管理器添加包时,请确保您的源不是 nuget.org,而是您的测试文件夹。 除非您已将两者都上传到 Nuget.org。 如何在本地安装 NuGet 包 .nupkg 文件?

Microsoft 不建议在一个 package 中使用多个程序集。 但如果你真的想要,那么这样做:打开主项目文件并替换它:

    <ItemGroup>
        <ProjectReference Include="..\SecondClassLibrary\SecondClassLibrary.csproj" />    
    </ItemGroup>

对此:

    <ItemGroup>
        <ProjectReference Include="..\SecondClassLibrary\SecondClassLibrary.csproj" PrivateAssets="all" />
    </ItemGroup>
    <PropertyGroup>
        <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
    </PropertyGroup>
    <Target Name="CopyProjectReferencesToPackage" DependsOnTargets="BuildOnlySettings;ResolveReferences">
        <ItemGroup>
            <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')-&gt;WithMetadataValue('PrivateAssets', 'All'))" />
        </ItemGroup>
    </Target>

来源: https://github.com/NuGet/Home/issues/3891

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM