3

我有一个使用 ServiceStack 的项目;我们正在运行旧的 3.9.x 代码库,而不是升级到 4.x,因为 ServiceStack 4 需要商业许可证。

我自己的 API 客户端在.nuspec文件中定义了一个依赖项,如下所示:

<dependencies>
  <dependency id="DotNetOpenAuth.OAuth2.Client" version="[4.3,5)" />
  <dependency id="log4net" version="[2.0,2.1)" />
  <dependency id="ServiceStack" version="[3.9.71,4)" />
</dependencies>

问题是 - ServiceStack包依赖于 ServiceStack 框架的其他各个部分,安装 ServiceStack 3.9.71 就是将ServiceStack.Text v4.0.24 安装到我的项目中。它确实弹出了要求接受许可证的对话框,这提醒我发生了一些奇怪的事情 - 但没有手动定义我自己的其他所需 ServiceStack 组件的依赖项,我如何确保我不会结束在我的项目中使用未经许可的 ServiceStack 4.x?

4

2 回答 2

7

在您的 .nuspec 中明确说明 ServiceStack.Text 依赖项并将其放在 ServiceStack 依赖项之前。

<dependencies>
  <dependency id="DotNetOpenAuth.OAuth2.Client" version="[4.3,5)" />
  <dependency id="log4net" version="[2.0,2.1)" />
  <dependency id="ServiceStack.Text" version="[3.9.71,4)" />
  <dependency id="ServiceStack" version="[3.9.71,4)" />
</dependencies>

这将强制 NuGet 使用约束解析 ServiceStack.Text。

仅使用版本范围[3.9.71,4)安装 ServiceStack 的问题在于,NuGet 将 ServiceStack.Common 依赖项解析为它确定为版本 3.9.11 的 ServiceStack.Common 的最低兼容版本。ServiceStack.Common 3.9.11 没有为 ServiceStack.Text 指定依赖范围,因此 NuGet 安装了 4.0 版本。ServiceStack.Common 的更高版本确实有一个 ServiceStack.Text 包的范围,但旧版本没有。因此,如果不明确依赖关系或更改 ServiceStack.Text NuGet 包以使其位于某个范围内,那么在安装 NuGet 包时您无能为力。

您唯一可以做的另一件事是在您的 packages.config 文件中设置一个约束,以防止安装较新版本的 ServiceStack。

<packages>
    <package id="ServiceStack.Text" version="3.9.71" allowedVersions="[3.9.71,4)" />
</packages>
于 2014-08-02T15:17:31.090 回答
0

我为此制作了自己的“包装器”包,其中不包含额外文件,而只包含依赖项 - 如下所示:

<dependencies>
  <dependency id="ServiceStack.Text" version="[3.9.71]" />
  <dependency id="ServiceStack.Common" version="[3.9.71]" />
  <dependency id="ServiceStack.Redis" version="[3.9.71]" />
  <dependency id="ServiceStack.OrmLite.SqlServer" version="[3.9.71]" />
  <dependency id="ServiceStack" version="[3.9.71]" />
</dependencies>
于 2016-02-16T11:24:06.107 回答