wsky's blog,Record my technical life

just coding

导航

生产环境使用Nuget

关于Nuget http://nuget.org/

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

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

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

比如:

   1:  nuget update xx.sln
   2:  nuget update packages.config

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

   1:  nuget install packages.config

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

 

和build的集成度:

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

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

 

repository的安装位置不可配置:

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

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

 

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

下述范例所在目录结构:

image

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

创建包描述文件:

   1:  <?xml version="1.0"?>
   2:  <package xmlns="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>
  15:    </metadata>
  16:    <files>
  17:      <file src="Castle\Castle.Core.dll" target="lib\net40\Castle.Core.dll" />
  18:      <file src="Castle\Castle.Core.xml" target="lib\net40\Castle.Core.xml" />
  19:      <file src="Castle\Castle.DynamicProxy2.dll" target="lib\net40\Castle.DynamicProxy2.dll" />
  20:      <file src="Castle\Castle.DynamicProxy2.xml" target="lib\net40\Castle.DynamicProxy2.xml" />
  21:      <file src="Castle\Castle.MicroKernel.dll" target="lib\net40\Castle.MicroKernel.dll" />
  22:      <file src="Castle\Castle.MicroKernel.xml" target="lib\net40\Castle.MicroKernel.xml" />
  23:      <file src="Castle\Castle.Windsor.dll" target="lib\net40\Castle.Windsor.dll" />
  24:      <file src="Castle\Castle.Windsor.xml" target="lib\net40\Castle.Windsor.xml" />
  25:    </files>
  26:  </package>

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

   1:  echo off
   2:  mkdir assembly\packages
   3:  echo pack
   4:  forfiles /p assembly /m *.nuspec /c "cmd /c ..\tools\nuget pack @file -outputdirectory packages"
   5:  echo push
   6:  forfiles /p assembly\packages /m *.nupkg /c "cmd /c ..\..\tools\nuget 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\nuget install @file -o %2"
   4:  echo update
   5:  forfiles /s /m packages.config /c "cmd /c %1\nuget update @file -source http://ops-base/feeds/nuget"
   6:  echo on

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

   1:  <?xml version="1.0"?>
   2:  <project name="infrastructure" default="build">
   3:    <property name="project.config" value="release" dynamic="true" />
   4:    <!--path-->
   5:    <property name="dir" value="."/>
   6:    <property name="dir.tools" value=".\tools"/>
   7:    <property name="build.base" value="build\${project.config}"/>
   8:    <property name="build.absolutepath" value="${path::get-full-path(build.base)}" />
   9:    <!--msbuild-->
  10:    <property name="msbuild" value="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" />
  11:    <property name="msbuild.config" value="Debug" dynamic="true"/>
  12:    <if test="${project.config=='Release'}">
  13:      <property name="msbuild.config" value="Release"/>
  14:    </if>
  15:    <property name="msbuild.params" 
  16:              value="/t:rebuild 
  17:              /p:Configuration=${msbuild.config}
  18:              /p:AllowUnsafeBlocks=true
  19:              /t:ResolveReferences" />
  20:    <property name="msbuild.params.weboutput" value="/t:_CopyWebApplication /p:WebProjectOutputDir=${build.absolutepath}" />
  21:    <property name="msbuild.params.output" value="/p:OutputPath=${build.absolutepath}" />
  22:    <!--nuget-->
  23:    <property name="nuget" value="${path::get-full-path(dir.tools)}" />
  24:    <property name="nuget.packages" value="${dir}\packages" />
  25:    <property name="nuget.install" value="${dir}\nuget.install.bat" />
  26:    <property name="nuget.params.install" value="${nuget} ${path::get-full-path(nuget.packages)}" />
  27:   
  28:     <!--build infrastructure-->
  29:    <target name="base" description="Infrastructure">
  30:      <exec program="${nuget.install}" commandline="${nuget.params.install}" workingdir="${dir}" />     
  31:      <exec program="${msbuild}"
  32:            commandline="${msbuild.params} ${msbuild.params.output}"
  33:            workingdir="${dir}\Infrastructure\" />
  34:    </target>
  35:  </project>

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

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

   1:  .\tools\nant\bin\nant base

 

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

posted on 2011-09-18 13:15  wsky  阅读(2594)  评论(3编辑  收藏  举报