【问题标题】:Is nuget appropriate for daily development workflow?nuget 适合日常开发工作流程吗?
【发布时间】:2013-11-29 15:02:51
【问题描述】:

我正在寻找 nuget 以改进开发过程中依赖项(内部和第三方)的自动处理。

只要你通过 CI Build Server 开发,一切都好:

  1. 获取 A 和 B 的最新源代码,其中 B 依赖于 A
  2. 修复 A 中的错误
  3. 构建 A
  4. 检查源代码管理
  5. CI 构建服务器已启动
  6. 新的 nuget 包已创建并放置在公司存储库中
  7. 构建 B(将获得更新的 A 包)
  8. 运行 B 以验证 A 中的错误是否已修复 n.重复n次

但是,我想知道是否可以作为单个开发人员在本地工作,而不必等待 CI 构建服务器生成新包?

Nuget 有一个功能包还原,它将在构建时自动下载所有依赖项。您还可以列出包还原应查找包的存储库顺序。

如果工作流程可以变成:

  1. 获取 A 和 B 的最新源代码,其中 B 依赖于 A
  2. 修复 A 中的错误
  3. 构建 A
  4. (构建创建本地 nuget 包)
  5. 运行 B 以测试 A 中的(已解决)错误(现在应该使用我们的本地 nuget 包,而不是本地存储库)
  6. ...重复n次
  7. 检查源代码管理
  8. CI 构建服务器已启动
  9. 在公司存储库中创建了新的 nuget 包

这是否可以使用 Visual Studio、MSBuild、CI 构建服务器和 nuget?我对在本地开发的同时制作本地包特别感兴趣。

请注意,我有本机项目,尽管除了构建后生成 nuget 包外,这将是一个我希望适用于 C# 和 C++ 项目的工作流。

【问题讨论】:

  • 这里有同样的问题,找到了一个可行的解决方案,但 Nuget 不能很好地使用它,所以 nop。回到手动挂钩/取消挂钩依赖项。对少数人来说效果很好,但我们有数百人,这让这些受赠者对构建系统和它的主人进行了一次程序员的音叉革命!如果有的话,我会继续寻找并在这里发布我的发现(我自己会问的!)
  • @Newtopian:很酷,请让我们保持最新状态:) 也许您可以详细说明您的尝试,这样我们就不必这样做了? :)
  • 我会为没有 CI 服务器的本地开发这样做:stackoverflow.com/a/63485994/1662819

标签: automation continuous-integration nuget nuget-package-restore


【解决方案1】:

我现在的解决方案虽然远非理想,但我认为效果最好。哦!这是一项正在进行的工作,因此在我弄清楚如何解决问题后,它将在未来几周/几个月内发生变化。

我现在主要需要处理托管 DLL,但我确实有一些本机代码和最糟糕的多平台本机代码最终要处理。

创建一个本地存储库,基本上只是一个文件夹,然后在您的 nuget 提要列表中进行配置。

然后我创建了一个任务 (MSBuild),它将打包项目并将其输出到本地存储库的根文件夹中。确保你的包的版本一直在增加。目前我通过编辑程序集版本手动执行此操作。

一旦构建,更新引用它的其他项目,我通常通过包管理器控制台 (update-package) 执行此操作。

每个更新的项目,提升他们的版本冲洗车床并重复,直到您到达最顶层的项目(实际程序)。

一旦一切都很好并且您准备好提交,那么构建系统应该进行自己的打包并将其发送到您的官方存储库。

好人

  • 中间开发版本不会阻塞存储库和构建系统,这些垃圾仍然(应该)保持在本地。
  • 本地存储库非常易于设置,甚至可以通过全局 nuget 配置在不更改 VS 的情况下完成。
  • 这对包恢复或将包签入项目的两种范式都很友好。也就是说,我建议不要签入您在本地构建的包,而是最好通过构建系统提交到本地存储库的包。本地构建的内容应保持本地化。

坏人

  • 仍然比仅将项目添加到解决方案要复杂得多。
  • 依赖关系树越深(或更宽),痛苦就越大。

丑陋的

  • 使一些本机 nuget 行为变得非常古怪和烦人:
    • 如果您的 VS 连接到版本系统(对我来说是强制的),更新操作需要永远。我听说他们“解决”了这个问题,如果现在最糟糕的话,我不想看到以前的情况!
    • 让 nuget 将非代码引用更改回从不复制是一件很痛苦的事情。

如果只是

  • 直接从 nuspec 配置内容依赖项的所需状态(始终复制、从不复制或更新)并完成! (哦,同样的故事,ClickOnce 内容状态包括、排除等)
  • 快速更新操作,2 分钟完成十几个项目简直是疯了,特别是如果最终目标是管理 500+ 个。
  • 也许是一种混合模式,我们在本地使用项目包含,但构建系统将使用 nuget 依赖项(并在必要时构建它们)
  • 如果要解析项目,请遵循 MSBuild 解析规则并遵守条件语句。 还有一些问题我还没有弄清楚,比如如何管理存储库中的多个代码分支。如何在食物链的上游处理版本冲突。在一个大型项目中(最终我们必须将 500 多个单独的项目放在一个应用程序可执行文件中,预计会发生冲突)。

我很想把健全的依赖管理带来 Maven 的所有优点,但到目前为止,我还没有发现 nuget 足够成熟,甚至无法考虑向开发团队提出它。

【讨论】:

    【解决方案2】:

    当然。在我们的解决方案中,NuGet 将库停放在解决方案层次结构的“包”目录中,该目录最终保存在 TFS 中。这允许包含所需库的完整解决方案检出。如果您打算更新通常由 NuGet 提供的库,则需要更新依赖项目的引用以指向包含通常由 NuGet 进程提供的更新代码的项目。

    在签入您的常规解决方案工作(不是 NuGet 相关库)之前,请确保解决方案的 NuGet 库是最新的,并且解决方案中的引用指向已安装的 NuGet 库。当然,您将事先签入并获取 NuGet 相关库。

    【讨论】:

    • 感谢您的快速回答。我忘了说它是 C++。我不想将二进制文件等检查到源代码管理中,我希望 nuget 为我维护一个本地缓存,从而使建议的工作流程成为可能。我们也只将项目保留在源代码控制中 - 而不是解决方案。还有可能吗?
    • 明白。我脑子里有 C#。有一个我没有使用过的“NuGet for C++”。当然,include/lib 范式对于 C/C++ 更灵活,所以我倾向于说“是”。 FWIW,我通常启动/构建 C/C++ 项目,每个项目都有自己的环境设置/变量。因此,当您维护 NuGet 库时,您的 inc/lib 可以指向它;否则,指向为指向分布式 NuGet 二进制文件的团队建立的位置。 HTH。
    • 我希望 C# 和 C++ 都能实现这一点。我发现了包还原功能:如果我首先列出我的本地存储库,然后列出公司范围的存储库,这不应该自动工作吗?即包还原从我的本地存储库中获取我新建的包 A。
    • 我已经用更多细节更新了这个问题,希望它更清楚我想要实现的目标(以及如何实现)。
    • 我目前没有其他要添加的内容,但这是一个很棒的工作流程问题。关于包还原功能,是否仅在包丢失时才会发生这种情况,还是可以强制覆盖构建服务器上可能存在的现有设置?
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多