Asp.net mvc 4 使用共享包目录和共享解决方案目录将NuGet集成到大型现有代码库中
Q:是否可能/可行,将多个解决方案存储在一个“解决方案”目录中,将多个NuGet软件包存储在另一个“软件包”目录中,并且所有内容都可以与不同的版本很好地配合使用? 更多详情 例如:我有两个项目。ProjectA需要Newstonsoft.Json.4.5.11,ProjectB需要Newstonsoft.Json.5.0.6 例如,我有一个解决方案文件。我需要所有的解决方案文件都在同一个目录中(这只是接下来的过程,一个目录中的所有解决方案都是依次构建的) 默认情况下,NuGet将在每个解决方案文件旁边创建一个Asp.net mvc 4 使用共享包目录和共享解决方案目录将NuGet集成到大型现有代码库中,asp.net-mvc-4,visual-studio-2012,nuget,Asp.net Mvc 4,Visual Studio 2012,Nuget,Q:是否可能/可行,将多个解决方案存储在一个“解决方案”目录中,将多个NuGet软件包存储在另一个“软件包”目录中,并且所有内容都可以与不同的版本很好地配合使用? 更多详情 例如:我有两个项目。ProjectA需要Newstonsoft.Json.4.5.11,ProjectB需要Newstonsoft.Json.5.0.6 例如,我有一个解决方案文件。我需要所有的解决方案文件都在同一个目录中(这只是接下来的过程,一个目录中的所有解决方案都是依次构建的) 默认情况下,NuGet将在每个解决方案文
包
目录
我创建了一个nuget.config
文件,允许我将包存储在一个名为“SharedPackages”的目录中,答案如下:
如果我创建ProjectB,默认情况下它有Json.NET 4.5.11。如果我转到管理解决方案的NuGet软件包
,我可以选择将其更新为5.0.6版。这很好,因为ProjectB需要更新的版本。更好的是,现在在我的共享包
目录中,两个版本的Json.NET都有一个并排的目录,因此ProjectA可以使用旧版本
但是,现在我想将ProjectC创建为一个完整的MVC4 Web应用程序。对于JQuery,在VS2012中创建ASP.NET MVC4应用程序时,当前获得的版本是1.8.2。我还获得了淘汰赛2.2.0
我的过程是,删除默认的包
目录,将新解决方案移动到现有nuget.config
旁边的解决方案
目录,并编辑新解决方案文件以更新新.csproj文件的相对路径。然后,当我构建时,NuGet Package Manager将我需要的额外包(ProjectA和ProjectB未使用的)恢复到共享包
目录。然而。。。我得到构建错误,它无法解决一些引用,包括DotNetOpenAuth、webfeel、System.Spatial。。。引用指向包
目录,而不是共享包
目录
顺便提一下:如果我为解决方案启用包还原,那么默认情况下,它还会尝试将它们还原到解决方案
目录中的包
文件夹,而不是将它们还原到共享包
目录
大约在这一点上,我意识到仅仅创建nuget.config
文件对于ProjectA和ProjectB来说也是不够的,尽管它们看起来最初是工作的,.csproj中的引用。文件指向项目文件下的bin
文件夹,而不是我的SharedPackages
目录
因此,对于所有引用,我手动“查找并替换”。\packages
为。\..\SharedPackages
。我必须为ProjectA、ProjectB和ProjectC这样做。现在一切都正常运行了,新的包放到了正确的位置
现在,如果我回到ProjectA,添加淘汰包,这就是版本2.3.0。它与Project C使用的另一个淘汰包(版本为2.2.0)一起安装。这样做还将安装jQuery2.0.3以及jQuery1.8.2。到目前为止还不错
作为一个健全性检查,我创建了另一个Web应用程序—ProjectD,移动文件,更新解决方案和项目中的引用。这一次一切都是第一次构建的。我尝试在ProjectD中更新webfleep,看看它是否会保留ProjectC的旧版本。这会导致更多问题,它会将其安装到packages目录。webfleed似乎也有一个单独的配置设置
。。。它似乎无法恢复
然后我返回到ProjectB并尝试“全部更新”-看起来已经存在的文件在SharedPackages
中更新,新版本目录与现有目录并排,但任何新的依赖项(例如,现在我有了对Owin.dll的引用)都会放在packages
文件夹中:(如果我删除了ProjectB中的packages
文件夹和bin
文件夹,然后构建ProjectB解决方案,可以理解,我会得到构建错误,包在任何时候都不会自动恢复到SharedPackages
目录
甚至可以将NuGet设置为更新解决方案旁边的包以外的公共目录中的包吗?
只使用默认的软件包
文件夹而不是共享软件包
会更容易吗,还是我仍然会有问题?
这已经变成了太多的问题。为了尝试并保持它在范围内,有人尝试过类似的设置吗?他们克服了什么障碍,如何管理它,还是完全放弃了?如果放弃了,您最终如何使用NuGet在大量的代码库中管理包
我很欣赏这一点,这个问题在这个特定的问题上得到了很好的回答,但是这里的用例略有不同:。它也与这个问题几乎相同:,但我还是决定添加这个问题,因为这个问题更侧重于为不同的解决方案提供不同的配置,而在这里,我希望所有的软件包都放在一个地方,我只想实现它,看看它是否可行。而且我认为故障排除和研究时间可能对某些人有用
<settings>
<repositoryPath>..\SharedPackages</repositoryPath>
</settings>
\Projects\ProjectA
\Projects\ProjectB
\Solutions
\SharedPackages