如何在生产环境使用Nuget

开发 后端
本文将简单介绍在生产环境使用Nuget,要在实际生产环境使用它来做打包和包管理,比之更为成熟的Maven来说,从目前版本来看稍有不足。

  关于Nuget http://nuget.org/

  官方提供的使用文档比较丰富 http://docs.nuget.org/

  要在实际生产环境使用它来做打包和包管理,比之更为成熟的Maven来说,从目前版本来看稍有不足,主要是以下几点:

  packages.config的继承和解决方案中的识别

  比如:

  1. nuget updatexx.sln2: nuget updatepackages.config 

  它做的事只是对比包得版本是否有更新并更新之,只要版本没有变化,即使本地仓库没有这个包也不会去下载它,而

  1. nuget install packages.config 

  只能指定具体的config文件,不能通过一个sln件自动去扫描解决方案里的所有packages.config

  和build的集成度:

  类似上面一点,build的时候不会对本地仓库不存在的必备依赖去自动获取

  nuget虽然提供 -build参数,但是仅是使用了MSBuild,本身的构建描述能力缺乏(所以下文在生产环境使用会搭配NANT来完成构建过程),而maven中则比较完整的集成了这个过程

  repository的安装位置不可配置:

  默认情况下package的安装目录是在.sln所在的目录下建立一个packages目录,也就是说是solutionfile级别的,这个对于项目数量多的时候是比较难接受的,本地开发还好,在build服务器构建的时候就比较麻烦了,不能再同一个位置管理包

  这个问题在它的官方已经有人在问了,估计下几个版本会有动作

  以下提供一些解决上述问题或实际应用时的一些方法

  下述范例所在目录结构:

  http://ops-base/feeds/是自己hosting的一个nuget feed(http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds)

  创建包描述文件:

  1. <?xmlversionxmlversion="1.0"?> 
  2. <packagexmlnspackagexmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> 
  3. <metadata> 
  4. <id>Package.Castle</id> 
  5.  <version>2.1</version> 
  6. <title>Castle</title> 
  7. <authors>Castle</authors> 
  8. <owners/> 
  9. <requireLicenseAcceptance>false</requireLicenseAcceptance> 
  10.  <description> 
  11. IOC容器  
  12.  </description> 
  13.  <copyright>2011</copyright> 
  14. <language>zh-CN</language> </metadata> <files> 
  15.  <filesrcfilesrc="CastleCastle.Core.dll"target="lib et40Castle.Core.dll"/> 
  16.  <filesrcfilesrc="CastleCastle.Core.xml"target="lib et40Castle.Core.xml"/> 
  17. <filesrcfilesrc="CastleCastle.DynamicProxy2.dll"target="lib et40Castle.DynamicProxy2.dll"/> 
  18.  <filesrcfilesrc="CastleCastle.DynamicProxy2.xml"target="lib et40Castle.DynamicProxy2.xml"/> 
  19. <filesrcfilesrc="CastleCastle.MicroKernel.dll"target="lib et40Castle.MicroKernel.dll"/> 
  20.  <filesrcfilesrc="CastleCastle.MicroKernel.xml"target="lib et40Castle.MicroKernel.xml"/> 
  21.  <filesrcfilesrc="CastleCastle.Windsor.dll"target="lib et40Castle.Windsor.dll"/> 
  22.  <filesrcfilesrc="CastleCastle.Windsor.xml"target="lib et40Castle.Windsor.xml"/> 
  23. </files> 
  24. </package> 
  25.  
  26.    

  批量打包和发布到feeds,pack.bat脚本如下:

  1.  echo off  
  2.  mkdir assemblypackages  
  3.  echo pack  
  4.  forfiles /p assembly /m *.nuspec /c "cmd /c .. ools uget pack @file-outputdirectory packages" 
  5.  echo push  
  6.  forfiles /p assemblypackages /m *.nupkg /c "cmd /c .... ools uget push @file-s http://ops-base/feeds/hello1234" 
  7.  echo on 

  批量安装和更新本地package,nuget.install.bat脚本如下:

  1. echo off  
  2. echo install  
  3. forfiles /s /m packages.config /c "cmd /c %1 uget install @file -o %2" 
  4. echo update  
  5. forfiles /s /m packages.config /c "cmd /c %1 uget update @file -source http://ops-base/feeds/nuget" 
  6. echo on 

  然后使用NANT然完成构建过程,nant.build部分内容如下:

  1.   <?xmlversionxmlversion="1.0"?> 
  2.  <projectnameprojectname="infrastructure"default="build"> 
  3. <propertynamepropertyname="project.config"value="release"dynamic="true"/> 
  4.  <!--path--> 
  5. <propertynamepropertyname="dir"value="."/> 
  6.  <propertynamepropertyname="dir.tools"value=". ools"/> 
  7. <propertynamepropertyname="build.base"value="build${project.config}"/> 
  8.  <propertynamepropertyname="build.absolutepath"value="${path::get-full-path(build.base)}"/> 
  9.  <!--msbuild-->10: <propertynamepropertyname="msbuild"value="C:WINDOWSMicrosoft.NETFrameworkv4.0.30319MSBuild.exe"/> 
  10. <propertynamepropertyname="msbuild.config"value="Debug"dynamic="true"/> 
  11. <iftestiftest="${project.config=='Release'}"> 
  12. <propertynamepropertyname="msbuild.config"value="Release"/> 
  13. </if> 
  14. <propertynamepropertyname="msbuild.params"    
  15. value="/t:rebuild   
  16.  /p:Configuration=${msbuild.config}  
  17. /p:AllowUnsafeBlocks=true 
  18.  /t:ResolveReferences" /> 
  19. <propertynamepropertyname="msbuild.params.weboutput"value="/t:_CopyWebApplication /p:WebProjectOutputDir=${build.absolutepath}"/> 
  20. <propertynamepropertyname="msbuild.params.output"value="/p:OutputPath=${build.absolutepath}"/> 
  21. <!--nuget--> 
  22. <propertynamepropertyname="nuget"value="${path::get-full-path(dir.tools)}"/> 
  23. <propertynamepropertyname="nuget.packages"value="${dir}packages"/> 
  24. <propertynamepropertyname="nuget.install"value="${dir} uget.install.bat"/> 
  25. <propertynamepropertyname="nuget.params.install"value="${nuget} ${path::get-full-path(nuget.packages)}"/> 
  26.  <!--build infrastructure--> 
  27. <targetnametargetname="base"description="Infrastructure"> 
  28. <execprogramexecprogram="${nuget.install}"commandline="${nuget.params.install}"workingdir="${dir}"/> 
  29.  <execprogramexecprogram="${msbuild}" 
  30.  commandline="${msbuild.params} ${msbuild.params.output}" workingdir="${dir}Infrastructure\"/> 
  31.  </target> 
  32.  </project> 

  上述nant脚本中,target=base的构建目标就是要构建的项目了,首先执行nuget.install.bat脚本更新本地packages,然后执行msbuild

  然后运行下述脚本执行构建:

  1. . ools antin ant base 

  到这里就完成了将nuget投入项目环境使用的相关准备工作:)

  作者:wsky (huangxu)

  出处:http://wsky.cnblogs.com/

【编辑推荐】

  1. VS.NET 2010已经发布了beta2版本 新功能
  2. 初步了解Visual Studio 2010 Professional专业版
  3. Visual Studio 2010中使用MTLM管理测试工具
  4. Visual Studio 2010 SP1公测版已经发布
  5. Visual Studio 2010中敏捷开发流程模板的应用
责任编辑:彭凡 来源: 博客园
相关推荐

2021-12-03 07:27:29

EFCore生产环境

2022-09-04 21:17:03

高可用Linkerd

2022-05-26 09:00:00

网站抓取Lightrun开发

2020-11-23 07:56:08

Vue生产环境

2020-02-25 15:47:05

ElasticsearLucene地方

2015-08-03 09:08:29

2020-09-14 15:30:23

开发技能代码

2015-11-20 15:28:36

AWSGoAWS SDK for

2012-02-07 09:56:06

无代理防毒产品

2015-10-28 16:20:10

短生命周期容器原生云计算

2022-10-21 11:14:44

2018-11-20 10:10:54

Redis数据库模糊查询

2020-12-25 09:00:00

Kubernetes容器开发

2019-09-18 20:46:57

容器生产环境数据中心

2022-05-09 23:03:38

机器学习人工智能工业4.0

2023-11-14 17:40:32

2021-10-28 19:08:29

Python虚拟环境

2020-09-14 07:35:40

Redis命令框架

2021-10-29 10:50:13

XfceXubuntuLinux

2013-08-16 11:17:35

虚拟桌面虚拟快照
点赞
收藏

51CTO技术栈公众号