Log*_*arr 25 c# teamcity visual-studio-2010 nuget
我有我的工作,它包含4个类库项目(一个解决方案A
,B
,C
,D
).A
并且B
可以被认为是解决方案中的顶级项目.两者A
和B
参考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.
另请参阅命令行参考.
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->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))" />
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
来源: https: //github.com/NuGet/Home/issues/3891
归档时间: |
|
查看次数: |
22074 次 |
最近记录: |