【发布时间】:2015-06-06 05:56:27
【问题描述】:
使用 2.7 版中添加的 NuGet 自动包还原时,NuGet 会自动将任何丢失的包下载到位于解决方案级别的 packages\ 文件夹。当解决方案包含库(即 git 子树或 git 子模块)时,这会导致问题,因为库项目希望将包下载到位于其各自解决方案文件夹中的包文件夹(通常嵌套为主代码的解决方案文件夹中的子文件夹) 并且不知道在主代码的解决方案文件夹中查找包。例如:
primary_code_folder\
->primary_code.sln
->packages\
[various packages downloaded by NuGet]
->primary_code_project\
->library_solution_folder\
--->library_code.sln
--->packages\
[where the library project expects packages to reside]
--->library_code_project\
可能的解决方案:
- 手动打开每个库项目 .sln 文件并构建项目以确保在每个库包文件夹中恢复最新的包。这是不可取的,因为它要求每个开发人员记住每次有人更新/安装新包时都这样做。
- 以某种方式将每个库配置为也查看主解决方案代码中的包文件夹。这似乎是一个非常不受欢迎的修复,因为它会将库的代码修改为对正在使用的给定项目来说是唯一的。
- 将主代码的解决方案配置为在预构建事件命令行命令中运行
nuget.exe restore library_code.sln。但是,nuget.exe 并非自然存在于解决方案中,也不(默认情况下)位于路径变量中。因此,似乎将 nuget.exe 复制到项目中可能会导致以后的不兼容,因为更新不会被拉入。也许有解决方法? - 以某种方式配置 NuGet 以在项目级别而不是解决方案级别存储包?
谁能分享他们是如何解决这个问题的?此处 (NuGet Automatic Package Restore when using git submodules) 针对不同的情况提出了类似的问题,但答案不能满足我在这篇文章中描述的需求。
【问题讨论】:
-
几个月前我遇到了类似的问题,最后得到了一个类似于您的解决方案#3 的 msbuild 任务,因为我找不到更好的东西。问题是包还原是 Visual Studio 的一项功能,即如果您尝试构建不是从原始解决方案或使用 msbuild 命令行的东西,它不会执行。
-
谢谢。我想知道包还原是否是 Visual Studio 的一部分。这个工作流程的一个挑战是我们已经使用 git subtree 添加了库项目并且正在积极地编辑它。因此,如果我们对中断构建的库进行更改,错误将不会在 IDE 中正确显示,因为 msbuild 任务会在 Visual Studio 尝试编译主要代码解决方案之前失败。
-
我还不明白您当前和您想要的工作流程是什么:您是分别构建库和主要代码,还是想要一步构建所有内容。如果是这样,这是否必须在VS中执行?您是否控制所有项目,即更改库解决方案是否可以接受?
-
我们想要一步构建 VS 中的所有内容。我们可以控制一切,因此我们可以修改库解决方案。但是,我们在多个仓库中的多个 VS 解决方案中使用这个库(始终作为 git 子树,因此我们主动从每个主代码仓库推送/拉取库仓库)。
-
一步基本上也是我正在做的。您是否在应用程序解决方案中包含库的项目(不是解决方案)?因为否则,无论如何,您都需要一些单独的步骤来在应用程序之前构建库(您可以在其中注入包恢复)。
标签: .net visual-studio-2012 nuget git-submodules git-subtree