关于Nuget http://nuget.org/
官方提供的使用文档比较丰富 http://docs.nuget.org/
要在实际生产环境使用它来做打包和包管理,比之更为成熟的Maven来说,从目前版本来看稍有不足,主要是以下几点:
packages.config的继承和解决方案中的识别
比如:
- nuget updatexx.sln2: nuget updatepackages.config
它做的事只是对比包得版本是否有更新并更新之,只要版本没有变化,即使本地仓库没有这个包也不会去下载它,而
- 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)
创建包描述文件:
- <?xmlversionxmlversion="1.0"?>
- <packagexmlnspackagexmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
- <metadata>
- <id>Package.Castle</id>
- <version>2.1</version>
- <title>Castle</title>
- <authors>Castle</authors>
- <owners/>
- <requireLicenseAcceptance>false</requireLicenseAcceptance>
- <description>
- IOC容器
- </description>
- <copyright>2011</copyright>
- <language>zh-CN</language> </metadata> <files>
- <filesrcfilesrc="CastleCastle.Core.dll"target="lib et40Castle.Core.dll"/>
- <filesrcfilesrc="CastleCastle.Core.xml"target="lib et40Castle.Core.xml"/>
- <filesrcfilesrc="CastleCastle.DynamicProxy2.dll"target="lib et40Castle.DynamicProxy2.dll"/>
- <filesrcfilesrc="CastleCastle.DynamicProxy2.xml"target="lib et40Castle.DynamicProxy2.xml"/>
- <filesrcfilesrc="CastleCastle.MicroKernel.dll"target="lib et40Castle.MicroKernel.dll"/>
- <filesrcfilesrc="CastleCastle.MicroKernel.xml"target="lib et40Castle.MicroKernel.xml"/>
- <filesrcfilesrc="CastleCastle.Windsor.dll"target="lib et40Castle.Windsor.dll"/>
- <filesrcfilesrc="CastleCastle.Windsor.xml"target="lib et40Castle.Windsor.xml"/>
- </files>
- </package>
批量打包和发布到feeds,pack.bat脚本如下:
- echo off
- mkdir assemblypackages
- echo pack
- forfiles /p assembly /m *.nuspec /c "cmd /c .. ools uget pack @file-outputdirectory packages"
- echo push
- forfiles /p assemblypackages /m *.nupkg /c "cmd /c .... ools uget push @file-s http://ops-base/feeds/hello1234"
- echo on
批量安装和更新本地package,nuget.install.bat脚本如下:
- echo off
- echo install
- forfiles /s /m packages.config /c "cmd /c %1 uget install @file -o %2"
- echo update
- forfiles /s /m packages.config /c "cmd /c %1 uget update @file -source http://ops-base/feeds/nuget"
- echo on
然后使用NANT然完成构建过程,nant.build部分内容如下:
- <?xmlversionxmlversion="1.0"?>
- <projectnameprojectname="infrastructure"default="build">
- <propertynamepropertyname="project.config"value="release"dynamic="true"/>
- <!--path-->
- <propertynamepropertyname="dir"value="."/>
- <propertynamepropertyname="dir.tools"value=". ools"/>
- <propertynamepropertyname="build.base"value="build${project.config}"/>
- <propertynamepropertyname="build.absolutepath"value="${path::get-full-path(build.base)}"/>
- <!--msbuild-->10: <propertynamepropertyname="msbuild"value="C:WINDOWSMicrosoft.NETFrameworkv4.0.30319MSBuild.exe"/>
- <propertynamepropertyname="msbuild.config"value="Debug"dynamic="true"/>
- <iftestiftest="${project.config=='Release'}">
- <propertynamepropertyname="msbuild.config"value="Release"/>
- </if>
- <propertynamepropertyname="msbuild.params"
- value="/t:rebuild
- /p:Configuration=${msbuild.config}
- /p:AllowUnsafeBlocks=true
- /t:ResolveReferences" />
- <propertynamepropertyname="msbuild.params.weboutput"value="/t:_CopyWebApplication /p:WebProjectOutputDir=${build.absolutepath}"/>
- <propertynamepropertyname="msbuild.params.output"value="/p:OutputPath=${build.absolutepath}"/>
- <!--nuget-->
- <propertynamepropertyname="nuget"value="${path::get-full-path(dir.tools)}"/>
- <propertynamepropertyname="nuget.packages"value="${dir}packages"/>
- <propertynamepropertyname="nuget.install"value="${dir} uget.install.bat"/>
- <propertynamepropertyname="nuget.params.install"value="${nuget} ${path::get-full-path(nuget.packages)}"/>
- <!--build infrastructure-->
- <targetnametargetname="base"description="Infrastructure">
- <execprogramexecprogram="${nuget.install}"commandline="${nuget.params.install}"workingdir="${dir}"/>
- <execprogramexecprogram="${msbuild}"
- commandline="${msbuild.params} ${msbuild.params.output}" workingdir="${dir}Infrastructure\"/>
- </target>
- </project>
上述nant脚本中,target=base的构建目标就是要构建的项目了,首先执行nuget.install.bat脚本更新本地packages,然后执行msbuild
然后运行下述脚本执行构建:
- . ools antin ant base
到这里就完成了将nuget投入项目环境使用的相关准备工作:)
作者:wsky (huangxu)
出处:http://wsky.cnblogs.com/
【编辑推荐】