非传递包依赖?

时间:2016-11-15 17:58:03

标签: c# visual-studio-2015 nuget nuget-package nuspec

我有一个包X,取决于另一个包Y.默认情况下(Visual Studio 2015 Upd3 + nuget 3.5)任何引用包X的项目也将参考包Y进行更新。问题是,X的客户根本不需要参考Y,因为包Y的API不是也不应该向客户公开。

因此,预期的行为如下:在添加对包X的引用之后,应该在构建时将包Y的内容复制到输出文件夹中,但不应将包Y添加到项目引用中。

有没有办法呢?

理论上我们可以将基础设施包Y的来源包含到我们的项目X中(两个项目都是MIT许可下的开源项目)但我更喜欢使用或多或少的标准方法。

我们需要它的案例:

  • 我们正在调查的案例:nuget包含测试帮助程序,确保PDB文件与源(引用Microsoft.DiaSymReader包)匹配。我们不希望所有测试项目都引用Microsoft.DiaSymReader程序集。

  • 或多或少的理论问题(目前不是问题但如果项目将投入生产将会成为问题):使用Roslyn编译和运行脚本的自定义脚本引擎。我们不希望在将使用我们的脚本引擎的所有项目中引用Roslyn程序集。

后者的情况要糟糕得多,因为我们无法将roslyn源合并到我们的项目中,显然,也不能将roslyn二进制文件作为我们软件包的一部分进行分发。

欢迎任何建议!

2 个答案:

答案 0 :(得分:1)

您可以将Package Y的dll添加为Package X中的内容文件,这不会将Y dll添加到安装了Package X的项目中。

以下步骤显示如何使用Y dll创建包X作为内容文件。

  1. 通过Add - >将Y dll添加到Package X项目中现有项目。
  2. 选择所有Y dll并右键单击以打开“属性”窗口,设置"复制到输出目录" as"一直复制"。
  3. 使用nuget.exe将项目X打包为包X
  4. 现在,当您使用NuGet Package Explorer打开Package X.nupkg文件时,您会发现存储在内容文件夹中的Y dll。当您在其他项目上安装Package X时,Y dll将作为内容文件添加到项目中。构建项目后,Y dll将被复制到输出目录。

答案 1 :(得分:0)

由于您是程序包X的作者,因此您可以在nupkg文件中包含所需内容。你也可以包括第三方dll。

虽然技术上可行,但我不建议这样做。想想你的软件包X的消费者,有一天他们可能会决定使用软件包Y.突然之间,他们会遇到运行时错误,因为X期望不同版本的Y.