我想要的
我希望我的库能够与多个具有API更改的NuGet包版本一起运行。虽然我还没有深入研究,但这条路看起来很有前途:
- 通过指定 extern 命名空间别名 引用所有具有不同 API 的库版本。
- 为所需类创建代理,使用标志/异常/其他方式告诉实际支持什么。
- 根据实际加载到应用程序中的版本选择正确的代理。
- 不会调用不存在 API 的代码,因此一切都应该正常工作。
虽然这可能看起来很复杂,但它比直接支持每个版本的单独程序集具有许多优点:
- 我的库的版本不会像 1.2.3-for-2.3.4-to-2.6.8 那样变得混乱。在这种情况下,我甚至不知道版本控制应该如何工作。
- NuGet 用户不必在几个包之间做出选择,一个包适合所有人。
- 升级版本将变得简单明了,无需删除和添加我的包。
问题
但是,目前尚不清楚是否可能。甚至在进行代理和检测当前版本之前,我就卡在了基础知识上。
我甚至无法将多个 PackageReference
节点添加到我的 .csproj 文件中,只有一个引用实际起作用。虽然有一种 添加 extern 别名的解决方法,但 NuGet 不直接支持它们,但我无法达到那个点,因为我无法获得两个引用。如果我以某种方式获得了两个引用,我也无法区分它们。
问题
- 可以使用 extern 命名空间别名和代理这种方式来实现对多个版本的支持吗?
- 如果是,如何添加对多个版本的 NuGet 包的引用并在代码中使用它们?
- 如果不是,那么正确的方法是什么?
背景
我正在开发 CsConsoleFormat 库,用于格式化控制台输出。我想直接支持所有相关版本的流行命令行包,以便可以通过几乎没有编码的方式添加漂亮的命令行帮助和其他内容,无论使用哪个命令行解析库。
我想在我的情况下声明“我只支持最新版本”可能有些可接受,但我更愿意有更广泛的支持,即使这更加复杂。理想情况下,我希望 NuGet 包声明依赖于最低支持版本,但支持到最新版本。
目前进展
我有点让它工作了,但出现了很多问题。请参见 GitHub NuGet Home 上的问题获取更多详情。
Reference
而不是包引用)来实现所需功能。将所有版本(除了最小版本)作为Reference
与SpecificVersion
和Aliases
包含,然后将最小版本作为PackageReference
包含。结果将会有您想要的所有版本别名(最小版本将在全局命名空间中无别名可用)。打包的NuGet只会依赖>=最小版本,其他dll(其他版本)不会包含在包中。我刚试过了,它就是这样工作的(当然会有“版本之间的冲突”警告)。 - Evk