本文将简单介绍在生产环境使用Nuget要在实际生产环境使用它来做打包和包管理比之更为成熟的Maven来说从目前版本来看稍有不足 关于Nuget 官方提供的使用文档比较丰富 要在实际生产环境使用它来做打包和包管理比之更为成熟的Maven来说从目前版本来看稍有不足主要是以下几点 nfig的继承和解决方案中的识别 比如 nuget updatexxsln: nuget nfig 它做的事只是对比包得版本是否有更新并更新之只要版本没有变化即使本地仓库没有这个包也不会去下载它而 nuget install nfig 只能指定具体的config文件不能通过一个sln件自动去扫描解决方案里的所有nfig 和build的集成度 类似上面一点build的时候不会对本地仓库不存在的必备依赖去自动获取 nuget虽然提供 build参数但是仅是使用了MSBuild本身的构建描述能力缺乏(所以下文在生产环境使用会搭配NANT来完成构建过程)而maven中则比较完整的集成了这个过程 repository的安装位置不可配置 默认情况下package的安装目录是在sln所在的目录下建立一个packages目录也就是说是solutionfile级别的这个对于项目数量多的时候是比较难接受的本地开发还好在build服务器构建的时候就比较麻烦了不能再同一个位置管理包 这个问题在它的官方已经有人在问了估计下几个版本会有动作 以下提供一些解决上述问题或实际应用时的一些方法 下述范例所在目录结构 /ops-base/feeds/是自己hosting的一个nuget feed(-packages/hosting-your-own-nuget-feeds)创建包描述文件: <?xmlversionxmlversion="1.0"?> <packagexmlnspackagexmlns=""> <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="libet40Castle.Core.dll"/> <filesrcfilesrc="CastleCastle.Core.xml"target="libet40Castle.Core.xml"/> <filesrcfilesrc="CastleCastle.DynamicProxy2.dll"target="libet40Castle.DynamicProxy2.dll"/> <filesrcfilesrc="CastleCastle.DynamicProxy2.xml"target="libet40Castle.DynamicProxy2.xml"/> <filesrcfilesrc="CastleCastle.MicroKernel.dll"target="libet40Castle.MicroKernel.dll"/> <filesrcfilesrc="CastleCastle.MicroKernel.xml"target="libet40Castle.MicroKernel.xml"/> <filesrcfilesrc="CastleCastle.Windsor.dll"target="libet40Castle.Windsor.dll"/> <filesrcfilesrc="CastleCastle.Windsor.xml"target="libet40Castle.Windsor.xml"/> </files> </package>
批量打包和发布到feeds,pack.bat脚本如下: echooff mkdirassemblypackages echopack forfiles/passembly/m*.nuspec/c"cmd/c..oolsugetpack@file-outputdirectorypackages" echopush forfiles/passemblypackages/m*.nupkg/c"cmd/c....oolsugetpush@file-s&//ops-base/feeds/hello1234" echoon
批量安装和更新本地package,nuget.install.bat脚本如下: echooff echoinstall forfiles/s/mnfig/c"cmd/c%1ugetinstall@file-o%2" echoupdate forfiles/s/mnfig/c"cmd/c%1ugetupdate@file-source&//ops-base/feeds/nuget" echoon
然后使用NANT然完成构建过程,nant.build部分内容如下: <?xmlversionxmlversion="1.0"?> <projectnameprojectname="infrastructure"default="build"> <propertynamepropertyname="nfig"value="release"dynamic="true"/> <!--path--> <propertynamepropertyname="dir"value="."/> <propertynamepropertyname="dir.tools"value=".ools"/> <propertynamepropertyname="build.base"value="build${nfig}"/> <propertynamepropertyname="build.absolutepath"value="${path::get-full-path(build.base)}"/> <!--msbuild-->10:<propertynamepropertyname="msbuild"value="C:WINDOWSMicrosoft.NETFrameworkv4.0.30319MSBuild.exe"/> <propertynamepropertyname="nfig"value="Debug"dynamic="true"/> <iftestiftest="${nfig=='Release'}"> <propertynamepropertyname="nfig"value="Release"/> </if> <propertynamepropertyname="msbuild.params" value="/t:rebuild /p:Configuration=${nfig} /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)}"/> <!--buildinfrastructure--> <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投入项目环境使用的相关准备工作:) |