5

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

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

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

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

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

如果工作流程可以变成:

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

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

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

4

2 回答 2

3

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

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

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

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

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

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

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

好的

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

坏的

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

丑陋的

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

要是

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

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

于 2014-06-25T00:39:01.440 回答
2

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

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

于 2013-11-29T15:10:36.823 回答