Asp.net mvc 如何在没有internet的构建服务器/生产服务器上使用NuGet软件包? 背景

Asp.net mvc 如何在没有internet的构建服务器/生产服务器上使用NuGet软件包? 背景,asp.net-mvc,msbuild,continuous-integration,cruisecontrol.net,nuget,Asp.net Mvc,Msbuild,Continuous Integration,Cruisecontrol.net,Nuget,我有以下组成部分: 我的本地解决方案(.NET 4.5),它使用NuGet软件包 我的解决方案中的PowerShell构建脚本,具有构建、运行单元测试、到Web.config转换等目标 没有运行CruiseControl.NET的internet连接的生成服务器,它调用我的生成脚本来生成文件。它还充当开发构建的(IIS7)环境 具有IIS7且不具有internet访问权限的生产服务器 目标 我希望利用我的解决方案中的NuGet包,并将它们作为源代码的一部分存储在本地,而不必依赖于构建和生产服

我有以下组成部分:

  • 我的本地解决方案(.NET 4.5),它使用NuGet软件包
  • 我的解决方案中的PowerShell构建脚本,具有构建、运行单元测试、到Web.config转换等目标
  • 没有运行CruiseControl.NET的internet连接的生成服务器,它调用我的生成脚本来生成文件。它还充当开发构建的(IIS7)环境
  • 具有IIS7且不具有internet访问权限的生产服务器
目标 我希望利用我的解决方案中的NuGet包,并将它们作为源代码的一部分存储在本地,而不必依赖于构建和生产服务器上的internet连接或NuGet包服务器

问题:
  • 我如何告诉MSBuild正确部署这些包,或者这是NuGet的默认行为

默认情况下,Nuget会将所有依赖项放在
packages/
文件夹中。您只需将此文件夹添加到您的源代码管理系统中,Nuget在进行构建时不需要从internet下载任何内容。您还需要确保您的解决方案上没有配置Nuget Package Restore。

Scott Hanselman写了一篇优秀的文章,题为。如果你通读这篇文章,你会在最后看到,他提出的建议主要是临时类型的解决方案,他会不厌其烦地说,除非在紧急情况下,你永远不应该需要离线缓存

但是,如果你读到他的文章的底部,他会提出以下建议:

如果您担心公司范围内的外部依赖性 如果扩展,您可能希望拥有一个网络共享(可能在共享网络上) 在您的组织中包含NuGet的 你所依赖的软件包。这是一个有用的东西,如果你在一个 作为一个组织,低带宽的情况

这就是我在类似情况下所做的。我们与我们所依赖的各种软件包的最新版本共享(当然,我假设您在某种类型的网络上)。它工作得很好,只需要一点工作就可以半定期更新包(我们有一个季度更新周期)


另一篇可能对你(对我)也有帮助的文章是:

你必须做出决定;您可以在生成时下载/安装包(无论是使用包还原、您自己的脚本还是为您执行此操作的生成工具),或者将/packages程序集放在源代码管理中,就像它们位于/lib目录中一样

我们在内部使用package restore和NuGet的Visual Studio扩展时遇到了很多问题,我们几乎完全放弃了NuGet,因为它存在缺陷,尽管我们公司的2个产品中有1个是私有的NuGet存储库

基本上,我们管理生命周期的方式是使用我们的产品组合,这样:

  • ProGet缓存我们所有的NuGet包(包括我们自己发布的包和NuGet.org上的包)
  • BuildMaster执行CI和部署方面,并处理所有NuGet包恢复,因此我们永远不必处理大量签入库或包恢复这一解决方案梦魇
如果您要采用类似的过程,那么在第一个环境中创建包含已安装的NuGet包程序集的构建工件可能是最简单的,然后只需将该工件部署到生产环境中,而无需重复该过程

希望这有帮助,

-Tod

我知道这是一个古老的讨论,但由于项目的大小,存储所有需要的文件到底有多糟糕

如果一个库不可用,你应该替换它的想法是疯狂的。代码是要花钱的,因为您不能控制git或nuget上的库,所以应该有一个副本

许多公司的一个要求是审计。如果发现某个库窃取了您的数据,该怎么办。您如何确定库是否已从NUGET中删除,并且您甚至无法构建代码进行双重检查

网络上的一刀切的Nuget和git方式是不行的


我认为Nuget在过去的工作方式是,文件存储在本地,并且可以选择放在源代码管理中。

由于各种原因,这实际上不是推荐的做法。事实上,对于那些可以访问网络的人来说,Nuget提供了一个功能,可以自动下载丢失的包(由单个文件定义),这样你就不需要签入它们。()否则,请阅读下面的讨论,了解为什么不建议这样做:我同意,这种方法确实存在很多问题。我完全忘记了将Nuget指向本地存储库。对你的答案投了赞成票谢谢。是的…我犯了一个错误,在一个大型项目的某个点上签入了packages文件夹…Subversion没有很好地处理它。这就是我想分享我的经验的一个原因。在VS exist包管理器选项中,但我如何在CI服务器中配置msbuild以转到此网络共享?Tod,您能详细说明一下吗“在您的第一个环境中创建一个包含已安装NuGet软件包程序集的构建工件可能是最容易的,然后只需将该工件部署到生产环境中,而无需重复该过程。”?我需要将NuGet软件包放入我的压缩构建工件中。它只是packages文件夹吗?