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

Log*_*arr 25 c# teamcity visual-studio-2010 nuget

我有我的工作,它包含4个类库项目(一个解决方案A,B,C,D).A并且B可以被认为是解决方案中的顶级项目.两者AB参考C,并且D独立.

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

我的问题是我想创建一个包含所有4个库的NuGet包,而不必全部构建它们并手动收集它们的DLL.我知道我可以从技术上实现这一点,A或者B参考其余的项目,但这不是真正的关系,我觉得应该避免.

我已经做了很多关于这个问题的搜索,除了手动收集DLL并自己构建包之外,我找不到解决方案.有没有办法达到我想要使用NuGet的功能/能力的结果?

注意:如果标签不清楚,我目前正在使用带有TeamCity构建服务器的VS2010.如果它是相关的,我也通过Stash服务器使用Git.

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

Ale*_*ček 17

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

<file src="A\bin\Release\A.dll" target="lib\net40" />
<file src="B\bin\Release\B.dll" target="lib\net40" />
...
Run Code Online (Sandbox Code Playgroud)

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

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


Que*_*Que 15

如果你已经下载了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
Run Code Online (Sandbox Code Playgroud)

除了项目A中的文件外,生成的包还将包含项目B,C,D,E,F和G中的文件.

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

nuget pack A.csproj -IncludeReferencedProjects
Run Code Online (Sandbox Code Playgroud)

生成的包将包含项目B,D,E中的文件以及项目A中的文件,并且包依赖于C.

另请参阅命令行参考.

  • 我实际上已经通过重新设计项目结构解决了这个问题。您的答案忽略了我在项目中概述的真实项目关系,它不是像您解释的那样的树。 (4认同)
  • @Logarr:你介意添加一个描述你如何解决它的答案吗?谢谢! (3认同)

Ste*_*dis 5

2020 更新

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

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

  <ItemGroup>
    <ProjectReference Include="..\{ProjectFolder}\{ProjectName}.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>{ProjectName}.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup> 
Run Code Online (Sandbox Code Playgroud)

确认此解决方案在定位netstandard2.0及以上时有效。


小智 5

Microsoft 不建议在一个包中包含多个程序集。但如果您确实想要,请执行以下操作:打开主项目文件并将其替换为:

    <ItemGroup>
        <ProjectReference Include="..\SecondClassLibrary\SecondClassLibrary.csproj" />    
    </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

关于这一点:

    <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>
Run Code Online (Sandbox Code Playgroud)

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