21

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

我们有这样的东西:

- Common
  - Logging
     - Logging.NLog
- Threading

所以 Logging.NLog 依赖于 Logging,Logging on Common...等。

当我们打包 Logging.NLog 时,我希望 nuget 发现 Loggin 和 Common 依赖项。

目前,我用 Common 创建了一个包,然后在 Logging 中我安装了包 Common

install-package Common

但是每当我对 Common 进行修改时,我都必须更新包,它们是由我们的持续集成系统 (Hudson) 创建的,所以在我们开发时非常烦人。

我只想有一个项目参考(添加参考-> 项目...),而 nuget 无论如何都会发现依赖关系。

有没有办法实现它?

4

5 回答 5

20

有一个针对这个确切场景的计划功能。

这显然是这样的:

> nuget.exe pack proj.csproj -IncludeReferencedProjects

它显然是几天前实施的但仍有一些错误 正在 解决

就目前而言,该功能允许:

  • 将多个项目的工件打包到一个 nuget 包中(通过递归遍历项目引用),

或者

  • 如果引用的项目具有随附的 .nuspec 文件,则创建对这些项目的关联包的nuget 包引用。

功能请求可以追溯到 1.5,但它一直在下滑。不过最近,它收集了足够的质量(请求),计划在Nuget 2.3中发布。

发布计划将 2.3 版与“2013 年 4 月结束”挂钩,敬请期待。
(目前,最新的 Nuget 版本是 2.2.1)。

于 2013-03-15T11:42:58.070 回答
3

目前无法完全按照您的要求进行操作,但以下内容将帮助您简化更新。

听起来您需要将 nuspec 文件添加到您的解决方案中。类似于以下三个文件。注意后两个中的依赖关系。这些通过 [$version$] 引用相同的 dll 版本。这意味着当您运行以下命令时,它会更新所有三个,因为依赖项上的方括号需要特定版本的依赖包。

PM>更新包通用

在 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>

日志记录.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>

日志记录.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>
于 2012-06-26T16:04:08.850 回答
2

我认为查尔斯的意思是他希望 NuGet 自动将项目引用解析为包依赖项,如果所述引用的项目也用于构建 NuGet 包,对吗?

例子:

  1. 设置日志记录以生成 NuGet 包
  2. Logging.Nlog 设置为生成 NuGet 包
  3. Logging.Nlog 有一个对 Logging 的项目引用。
  4. 生成的 Logging.Nlog 包应该依赖于生成的 Logging 包。

这也是我一直在寻找的东西,但遗憾的是我发现它目前不受支持。上面有一个工作项,计划用于 NuGet 1.7,但还没有关于如何处理这个问题的设计。

于 2011-10-11T13:48:33.350 回答
1

这个线程有一个很好的建议:NuGet and multiple solutions

基本上,将通用组件分解为自己的解决方案,并具有自己的发布生命周期。

于 2012-05-15T22:22:18.580 回答
0

我管理这个实现它是这样的:

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

PrivateAssets="All"为每个项目添加MyProject.csproj。

于 2021-02-25T14:28:56.510 回答