【问题标题】:NuGet Cache And Versioning IssuesNuGet 缓存和版本控制问题
【发布时间】:2014-11-10 00:52:41
【问题描述】:

我在使用 NuGet 预发布包时遇到问题,想知道其他人在这种情况下做了什么。 NuGet 功能似乎与 Maven 中的预期行为完全不同,坦率地说,很奇怪。举个简单的例子,假设我们有程序集 FooAssembly 和 BarAssembly,其类定义如下:

富:

namespace Foo {
    class FooClass {
         public void TestA(){
         }
    }
}

酒吧:

namespace Bar {
    class BarClass {
         public static void Main(string[] args){
             FooClass foo = new FooClass();
             foo.TestA();
         }
    }
}

当我构建 Foo 时,它的版本会生成 Foo-1.0.0-SNAPSHOT.nupkg。当我将它添加为依赖项时,NuGet 会将其安装到 Bar 中,并将其放置在 %APPDATA% 下的本地缓存和源代码树中的包文件夹中。现在,如果我将方法 TestB() 添加到 Foo 并重建,它还会生成 Foo-1.0.0-SNAPSHOT.nupkg。我的构建按预期将这个新的 nupkg 文件放入我的 %APPDATA% 缓存中。但是,当我尝试重建 Bar 时,NuGet 没有检测到我在 %APPDATA% 中的 nupkg 已更改,因此没有可用的新 TestB 方法。我必须手动删除 src/packages 文件夹(或者至少是包中的 Foo 子目录)才能从我的缓存中重新获取包。

在 Maven 中,如果我要重建 Foo 并添加了 TestB 方法,它会将 Foo-1.0.0-SNAPSHOT 放在我的 .m2 缓存中,并且 Bar 将链接到新版本的 jar 并知道 TestB .

我的问题是,首先,我是否缺少 NuGet 的某些内容?其次,如果我不是,人们做了什么来解决这个缺点?添加 MSBuild 预构建步骤以清除项目包缓存?将内部版本号附加到 SNAPSHOT 的末尾(例如 SNAPSHOT42...这似乎对于项目中的多个开发人员来说会出现问题)?

感谢任何见解。谢谢。

【问题讨论】:

    标签: c# visual-studio maven nuget


    【解决方案1】:

    警告:已过期

    截至 2018 年,此答案已过时 - 请参阅我的 other answer 了解更新信息。

    没有 maven SNAPSHOT 的 Nuget 等效项

    NuGet 并不像 Maven 那样真正支持 SNAPSHOT 依赖项,尽管有一个 open issue 来实现类似的东西,还有一个 discussion 关于此类功能。

    建议的一种可能性是编写一个脚本:

    • 生成具有不同版本的新 Foo 包
    • 更新 Bar 以引用最新版本的 Foo

    另一种方法

    另外,当我处理自己的项目时,我总是从源代码构建和引用Foo。然后,一旦Foo 项目变得足够稳定以至于我不再对其进行太多更新,我就会开始停止通过源代码引用Foo,而是将其构建并作为 nuget 包进行引用。

    【讨论】:

    • 这或多或少是我们过去所做的。问题是它不能很好地扩展到非常非常大的系统。
    【解决方案2】:

    如果您在新的 csproj 文件格式中使用 PackageReference 元素,您现在可以使用 floating versions

    对于来自 Visual Studio 的构建,您需要 explicitly rebuild 来获取更改。对于非 Visual Studio 版本,您需要 -force 更新,如 an issue discussing open versions and updates 中所述。

    【讨论】:

    • 3年后还是不行,太可惜了
    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多