发布网友 发布时间:2023-05-10 19:23
共1个回答
热心网友 时间:2024-11-15 12:48
本文将简单介绍在生产环境使用Nuget 要在实际生产环境使用它来做打包和包管理 比之更为成熟的Maven来说 从目前版本来看稍有不足
关于Nuget
官方提供的使用文档比较丰富
要在实际生产环境使用它来做打包和包管理 比之更为成熟的Maven来说 从目前版本来看稍有不足 主要是以下几点
nfig的继承和解决方案中的识别
比如
nuget updatexx sln : nuget nfig
它做的事只是对比包得版本是否有更新并更新之 只要版本没有变化 即使本地仓库没有这个包也不会去下载它 而
nuget install nfig
只能指定具体的config文件 不能通过一个sln件自动去扫描解决方案里的所有nfig
和build的集成度
类似上面一点 build的时候不会对本地仓库不存在的必备依赖去自动获取
nuget虽然提供 build参数 但是仅是使用了MSBuild 本身的构建描述能力缺乏(所以下文在生产环境使用会搭配NANT来完成构建过程) 而maven中则比较完整的集成了这个过程
repository的安装位置不可配置
默认情况下package的安装目录是在 sln所在的目录下建立一个packages目录 也就是说是solutionfile级别的 这个对于项目数量多的时候是比较难接受的 本地开发还好 在build服务器构建的时候就比较麻烦了 不能再同一个位置管理包
这个问题在它的官方已经有人在问了 估计下几个版本会有动作
以下提供一些解决上述问题或实际应用时的一些方法
下述范例所在目录结构
创建包描述文件:
<?xmlversion xmlversion="1.0" ?> <packagexmlns packagexmlns="" > <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> <filesrc filesrc="CastleCastle.Core.dll"target="lib et40Castle.Core.dll" /> <filesrc filesrc="CastleCastle.Core.xml"target="lib et40Castle.Core.xml" /> <filesrc filesrc="CastleCastle.DynamicProxy2.dll"target="lib et40Castle.DynamicProxy2.dll" /> <filesrc filesrc="CastleCastle.DynamicProxy2.xml"target="lib et40Castle.DynamicProxy2.xml" /> <filesrc filesrc="CastleCastle.MicroKernel.dll"target="lib et40Castle.MicroKernel.dll" /> <filesrc filesrc="CastleCastle.MicroKernel.xml"target="lib et40Castle.MicroKernel.xml" /> <filesrc filesrc="CastleCastle.Windsor.dll"target="lib et40Castle.Windsor.dll" /> <filesrc filesrc="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&//ops-base/feeds/hello1234" echo on
批量安装和更新本地package,nuget.install.bat脚本如下:
echo off echo install forfiles /s /m nfig /c "cmd /c %1 uget install @file -o %2" echo update forfiles /s /m nfig /c "cmd /c %1 uget update @file -source&//ops-base/feeds/nuget" echo on
然后使用NANT然完成构建过程,nant.build部分内容如下:
<?xmlversion xmlversion="1.0" ?> <projectname projectname="infrastructure"default="build" > <propertyname propertyname="nfig"value="release"dynamic="true" /> <!--path--> <propertyname propertyname="dir"value="." /> <propertyname propertyname="dir.tools"value=". ools" /> <propertyname propertyname="build.base"value="build${nfig}" /> <propertyname propertyname="build.absolutepath"value="${path::get-full-path(build.base)}" /> <!--m *** uild-->10: <propertyname propertyname="m *** uild"value="C:WINDOWSMicrosoft.NETFrameworkv4.0.30319MSBuild.exe" /> <propertyname propertyname="nfig"value="Debug"dynamic="true" /> <iftest iftest="${nfig=='Release'}" > <propertyname propertyname="nfig"value="Release" /> </if> <propertyname propertyname="m *** uild.params" value="/t:rebuild /p:Configuration=${nfig} /p:AllowUnsafeBlocks=true /t:ResolveReferences" /> <propertyname propertyname="m *** uild.params.weboutput"value="/t:_CopyWebApplication /p:WebProjectOutputDir=${build.absolutepath}" /> <propertyname propertyname="m *** uild.params.output"value="/p:OutputPath=${build.absolutepath}" /> <!--nuget--> <propertyname propertyname="nuget"value="${path::get-full-path(dir.tools)}" /> <propertyname propertyname="nuget.packages"value="${dir}packages" /> <propertyname propertyname="nuget.install"value="${dir} uget.install.bat" /> <propertyname propertyname="nuget.params.install"value="${nuget} ${path::get-full-path(nuget.packages)}" /> <!--build infrastructure--> <targetname targetname="base"description="Infrastructure" > <execprogram execprogram="${nuget.install}"mandline="${nuget.params.install}"workingdir="${dir}" /> <execprogram execprogram="${m *** uild}" mandline="${m *** uild.params} ${m *** uild.params.output}" workingdir="${dir}Infrastructure\" /> </target> </project>
上述nant脚本中,target=base的构建目标就是要构建的项目了,首先执行nuget.install.bat脚本更新本地packages,然后执行m *** uild
然后运行下述脚本执行构建:
. ools antin ant base
lishixin/Article/program/net/201311/13014