您的位置:首页 > 产品设计 > UI/UE

<target>标签和web程序引用问题

2014-11-02 22:14 260 查看
有时候,我们会发现不得不用MSBuild进行生成项目,这时会抱怨,MSBuild真是不智能,特别是引用问题。当我们

使用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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息