<target>标签和web程序引用问题
2014-11-02 22:14
260 查看
有时候,我们会发现不得不用MSBuild进行生成项目,这时会抱怨,MSBuild真是不智能,特别是引用问题。当我们
使用web项目,并且,这个项目使用了外部生成好的dll,这个时候,你就会发现,web项目是没有工程文件的,也就
意味着你没法引用外部生成的dll,这时你会想,把这个引用到其他的层,但是你会失望的发现,为什么还是不行,这
个dll还是没有生成到web的bin目录下。MSBuild编译始终会报引用问题。
那么,问题就来了,这该如何做能,这时候,我推荐使用项目工程文件中的<target>标签。
当你打开一个项目的工程文件时,你应该发现如下:
注意,这个是系统生成的,默认是把这个注释掉的,需要手动修改掉注释,<target>任务,即之前说MSBuild中的目标,这里默认是有两个的,BeforeBuild 顾名思义,这个表示在MSBuild调用之前,会先调用这个节点中的所有的节点任务,而AfterBuild则相反,这个就表示在MSBuild编程生成成功后才会进行调用
这时候会发现,当有多个target的时候,就会出现调用的问题,默认是从上往下的,当时如果你想有自己的调用方式,这时候你可以如下:
在上面的demo中,一共有三个taeget,出现这样,这时候如果你想决定他们的调用顺序,这就需要用到DependsOnTargets属性,这个表示当当前目标调用前,要先保证这个属性中的target先被调用过才能运行当前的target,上面的demo就是说当CheckIn调用前,一定要保证CheckOut和Build先被调用过。
在这里,MSBuild附带了很多的任务,比如复制(Copy)这个就用于解决编译的引用问题,用于创建目录的MakeDir以及用于VS编译的Csc
1,Copy 这个方法就是用于文件的复制,这个就可以解决引用问题,原理是,在MSBuild编译结束后,把缺少的dll通过复制代码复制到需要的bin目录下
<CopySourceFiles="%(Reference.HintPath)" DestinationFolder="..\Web\Bin" />
CopySourceFiles表示要被复制的源文件,可以使用@(ItemType)找到对应的节点,如@(Reference),就表示在工程文件中的Reference节点,当需要找对应节点的子节点时需要使用%(Reference.HintPath),这个表示在Reference节点下的HintPath节点,DestinationFolder这个表示目标路径,是指需要把文件复制到地方,即想要复制的web次层的bin目录下,相对路径,使用就是把这个加到对应需要复制的引用了dll的那个层的工程文件中,加到
2,MakeDir这个用于创建文件夹
这里就是在目录下创建Output目录
3,Csc用于对于一个项目的编译生成,官方给的demo,学习过工程文件的基本上都知道下面节点的意思,我就不一一介绍了
<Target Name="Compile" DependsOnTarget="Resources" >
<Csc Sources="@(CSFile)"
TargetType="library"
Resources="@(CompiledResources)"
EmitDebugInformation="$(includeDebugInformation)"
References="@(Reference)"
DebugType="$(debuggingType)" >
<Output TaskParameter="OutputAssembly"
ItemName="FinalAssemblyName" />
</Csc>
</Target>
使用web项目,并且,这个项目使用了外部生成好的dll,这个时候,你就会发现,web项目是没有工程文件的,也就
意味着你没法引用外部生成的dll,这时你会想,把这个引用到其他的层,但是你会失望的发现,为什么还是不行,这
个dll还是没有生成到web的bin目录下。MSBuild编译始终会报引用问题。
那么,问题就来了,这该如何做能,这时候,我推荐使用项目工程文件中的<target>标签。
当你打开一个项目的工程文件时,你应该发现如下:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. --> <Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild"> </Target>
注意,这个是系统生成的,默认是把这个注释掉的,需要手动修改掉注释,<target>任务,即之前说MSBuild中的目标,这里默认是有两个的,BeforeBuild 顾名思义,这个表示在MSBuild调用之前,会先调用这个节点中的所有的节点任务,而AfterBuild则相反,这个就表示在MSBuild编程生成成功后才会进行调用
这时候会发现,当有多个target的时候,就会出现调用的问题,默认是从上往下的,当时如果你想有自己的调用方式,这时候你可以如下:
<Target Name=”CheckOut” ></Target> <Target Name=”Build” DependsOnTargets=”CheckOut”> <Task Name=”Build”.../> <Task Name=”UnitTest” ... /> </Target> <Target Name=”CheckIn” DependsOnTargets=”CheckOut;Build”> </Target>
在上面的demo中,一共有三个taeget,出现这样,这时候如果你想决定他们的调用顺序,这就需要用到DependsOnTargets属性,这个表示当当前目标调用前,要先保证这个属性中的target先被调用过才能运行当前的target,上面的demo就是说当CheckIn调用前,一定要保证CheckOut和Build先被调用过。
在这里,MSBuild附带了很多的任务,比如复制(Copy)这个就用于解决编译的引用问题,用于创建目录的MakeDir以及用于VS编译的Csc
1,Copy 这个方法就是用于文件的复制,这个就可以解决引用问题,原理是,在MSBuild编译结束后,把缺少的dll通过复制代码复制到需要的bin目录下
<CopySourceFiles="%(Reference.HintPath)" DestinationFolder="..\Web\Bin" />
CopySourceFiles表示要被复制的源文件,可以使用@(ItemType)找到对应的节点,如@(Reference),就表示在工程文件中的Reference节点,当需要找对应节点的子节点时需要使用%(Reference.HintPath),这个表示在Reference节点下的HintPath节点,DestinationFolder这个表示目标路径,是指需要把文件复制到地方,即想要复制的web次层的bin目录下,相对路径,使用就是把这个加到对应需要复制的引用了dll的那个层的工程文件中,加到
<Target Name="AfterBuild"> </Target>这个节点中间,这时候就会在生成成功后,把对应的dll复制到指定的bin
2,MakeDir这个用于创建文件夹
<PropertyGroup> <OutputDirectory>\Output\</OutputDirectory> </PropertyGroup> <Target Name="CreateDirectories"> <MakeDir Directories="$(OutputDirectory)"/> </Target>
这里就是在目录下创建Output目录
3,Csc用于对于一个项目的编译生成,官方给的demo,学习过工程文件的基本上都知道下面节点的意思,我就不一一介绍了
<Target Name="Compile" DependsOnTarget="Resources" >
<Csc Sources="@(CSFile)"
TargetType="library"
Resources="@(CompiledResources)"
EmitDebugInformation="$(includeDebugInformation)"
References="@(Reference)"
DebugType="$(debuggingType)" >
<Output TaskParameter="OutputAssembly"
ItemName="FinalAssemblyName" />
</Csc>
</Target>
相关文章推荐
- web.config中的<globalization >标签在将几个不同服务器上的网闸内容以统一面貌集成在自己网站上时的要考虑的问题
- <a>标签内嵌<input type="image">在IE中链接失效问题
- asp.net<Web版> ---将excel表数据导入到数据库问题<一>---未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0” 提供程序
- 对于<welcome-file-list>设置主页后无法引用CSS的问题
- <img>标签导致请求发送两次问题
- <button> 标签 id 与 function 重复时发生的问题
- <textarea>中嵌套其他标签输出出现不必要的空格和换行问题
- MyEclipse中创建WEB工程,运用<img>标签显示图片等,但无法显示问题
- <iframe>标签里的跳转问题
- <a>元素生成多个<a>的问题,元素标签结尾影响
- <转>关闭 程序崩溃时 windows 正在检查该问题的解决方案
- <base>标签在ie6下的问题
- JSF web页面的<h:inputTextarea>和数据库存储的回车换行及<br />问题
- HTML <base> 标签的 target 属性 —— <base target="_blank" />
- <java>程序当前路径问题
- <base target > 标签用法 及showModalDialog 问题
- Web.xml配置<taglib>标签报错问题(cvc-complex-type.2.4.a: Invalid content was found starting with element 'tag
- 在ASP.NET程序中用程序动态向<head>便签里添加<meta>标签
- iOS项目开发中,对后台返回数据为<null>时候的处理,避免取值产生程序崩溃问题
- <s:iterator/>标签取循环索引的问题