1

我有一个依赖于另一个包 Y 的包 X。默认情况下(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 二进制文件作为我们包的一部分分发。

欢迎任何建议!

4

2 回答 2

1

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

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

  1. 通过 Add -> Existing Items 将 Y dll 添加到 Package X 项目中。
  2. 选择所有 Y dll 并右键单击打开属性窗口,将“复制到输出目录”设置为“始终复制”。
  3. 使用 nuget.exe 将项目 X 打包为包 X

现在,当您使用NuGet Package Explorer打开 Package X.nupkg 文件时,您会发现 Y dll 存储在 content 文件夹中。当您在其他项目上安装 Package X 时,Y dll 将作为内容文件添加到项目中。构建项目后,Y dll 将被复制到输出目录。

于 2016-11-16T07:13:19.820 回答
0

由于您是包 X 的作者,因此您可以在nupkg文件中包含什么内容。您还可以包括第三方 dll。

尽管在技术上是可行的,但我不建议这样做。想想你的包 X 的消费者,他们有朝一日可能决定使用包 Y。突然他们会收到运行时错误,因为 X 期待不同版本的 Y。

于 2016-11-15T19:06:49.870 回答