为具有多个项目的解决方案创建NuGet包

23

我们目前正在构建一个包含多个项目的解决方案。

我们有类似于这样的东西:

- Common
  - Logging
     - Logging.NLog
- Threading

因此,Logging.NLog依赖于Logging,Logging依赖于Common......等等。

当我们打包Logging.NLog时,我希望NuGet能够发现Logging和Common的依赖关系。

目前,我创建了一个包含Common的包,在Logging中使用“Install-Package Common”安装了Common包。

install-package Common

但无论何时我对Common做出修改,我都必须更新包,并且它们是由我们的持续集成系统(Hudson)创建的,所以在开发过程中这相当麻烦。

我希望只需使用项目引用(添加引用->项目...),nuget就能自动发现依赖关系。是否有实现的方法?


你的意思是当你为Logging构建NuGet包时,希望它包含对Common包的依赖,因为Common已经通过NuGet包含在Logging中了吗? - Danny Tuppeny
可能是在一个解决方案中从多个项目创建一个NuGet包的重复问题。 - Michael Freidgeim
5个回答

21

有一个计划中的功能专门针对这种情况。

它看起来似乎是这样的:

> nuget.exe pack proj.csproj -IncludeReferencedProjects

据称不久前刚刚实现,但是仍然有bug需要解决整理

该功能当前允许:

  • 将多个项目的制品打包到单个NuGet程序包中(通过递归地遍历项目引用),

或者

  • 创建对这些项目相关包的NuGet程序包引用,如果引用的项目有相应的.nuspec文件。

该功能请求追溯到1.5,但一直推迟。不过最近,它聚集了足够的声量(请求)计划在Nuget 2.3中发布。

发布计划将版本2.3定于“2013年4月底”,请关注。
(目前,最新的Nuget版本是2.2.1)


3
在我的版本(2.5.40416.9020)中,这似乎可以很好地运作,无需在.nuspec文件(在此示例中为proj.nuspec)中添加任何<file>或<reference>元素。 - Kyle Krull

3

目前没有办法完全满足您的需求,但以下内容可以帮助您简化更新流程。

看起来您需要将nuspec文件添加到解决方案中,例如以下三个文件。请注意第二和第三个文件中的依赖项。它们引用与[$version$]相同的dll版本。这意味着,当您运行以下命令时,它会更新所有三个文件,因为依赖项中的方括号要求使用特定版本的相关包。

PM> update-package common

在Hudson中,您需要使用nuget pack命令(参见Nuget命令参考)执行这些nuspec文件,并将生成的软件包包含在您的构建成果中,同时部署到本地的nuget服务器上。这部分需要您自己完成。

另外,您还需要确保所有的程序集在同一次构建中使用相同的版本。同样,Hudson可以处理此问题,或者您可以使用一个通用的AssemblyInfo文件。

Common.nuspec

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
    <version>$version$</version>
    <authors>Charles Ouellet</authors>
    <owners />
    <iconUrl>http://domain/Content/images/LOGO_32x32.png</iconUrl>
    <id>Common</id>
    <title>Common</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>full description here</description>
</metadata>
<files>
    <file src="..\Common\bin\Release\Common.dll" target="lib\net40" />
    <file src="..\Common\bin\Release\Common.pdb" target="lib\net40" />
</files>
</package>

Logging.nuspec

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
    <version>$version$</version>
    <authors>Charles Ouellet</authors>
    <owners />
    <iconUrl>http://domain/Content/images/LOGO_32x32.png</iconUrl>
    <id>Logging</id>
    <title>Logging</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>full description here</description>
    <dependencies>
        <dependency id="Common" version="[$version$]" />
    </dependencies>        
</metadata>
<files>
    <file src="..\Logging\bin\Release\Logging.dll" target="lib\net40" />
    <file src="..\Logging\bin\Release\Logging.pdb" target="lib\net40" />
</files>
</package>

Logging.NLog

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
    <version>$version$</version>
    <authors>Charles Ouellet</authors>
    <owners />
    <iconUrl>http://domain/Content/images/LOGO_32x32.png</iconUrl>
    <id>Logging.NLog</id>
    <title>Logging.NLog</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>full description here</description>
    <dependencies>
        <dependency id="Logging" version="[$version$]" />
    </dependencies>        
</metadata>
<files>
    <file src="..\Logging.NLog\bin\Release\Logging.NLog.dll" target="lib\net40" />
    <file src="..\Logging.NLog\bin\Release\Logging.NLog.pdb" target="lib\net40" />
</files>
</package>

是的!这可能是我需要的。我现在会尝试,但通过这种方式,我可以拥有一个VS解决方案,其中包含3个项目,每个项目可能引用解决方案中的其他项目,但是当我打包它们时,它们都是具有依赖于其他包的独立包。好的,我要去试试了。谢谢。 - Raif

2
我认为Charles的意思是如果那些被引用的项目也用于构建NuGet包,他希望NuGet能够自动将项目引用解析为包依赖关系,对吗?
例如:
1. 设置Logging以生成NuGet包。 2. 设置Logging.Nlog以生成NuGet包。 3. Logging.Nlog引用Logging项目。 4. 生成的Logging.Nlog包应该在Logging包上有一个依赖项。
我也一直在寻找这样的功能,但很遗憾目前还不支持。有一个工作项正在进行(请参考此处),计划在NuGet 1.7中实现,但目前尚未有如何处理此问题的设计。

1
这个帖子提出了一个好建议:NuGet和多个解决方案
基本上,将共同的组件分离到它们自己的解决方案中,并拥有自己的发布生命周期。

0
我是这样实现的:

<ProjectReference Include="MyProject2.csproj" PrivateAssets="All" />

在每个项目的MyProject.csproj文件中添加PrivateAssets="All"

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