惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
V
V2EX
aimingoo的专栏
aimingoo的专栏
爱范儿
爱范儿
博客园 - 聂微东
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
月光博客
月光博客
云风的 BLOG
云风的 BLOG

博客园 - wsky

为WebClient增加Cookie支持 keepalived安装和使用 NHibernate分享 PPT 开源选型关注点 SocketAsyncEventArgs stunnel+haproxy SSL以及问题记录 快速实现一个简单的bigpipe模型 Velocity2010大会回顾 小结一下关于bpm实施方面的交流 乱弹之企业应用 互联网企业流程部门价值方向的一些探讨 Live Writer的代码插件 再谈团队,项目,产品 【渐进】设计一个模拟并行的线程同步组件 【渐进】关于反向代理,负载均衡 【渐进】浅尝DDD,对"试卷"建模 【渐进】延迟加载机制的简易实现(上) - wsky - 博客园 略谈“开发效率” 分工,协作,团队
生产环境使用Nuget
wsky · 2011-09-18 · via 博客园 - wsky

关于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投入项目环境使用的相关准备工作:)