2015-10-06 69 views
0

我一直在尝试使用MSBuild创建自定义目标。我目前正试图添加对使用JAWS脚本编译器编译文件的支持。这是我迄今为止所拥有的。如何创建仅在必要时运行的MSBuild目标

Scripts.props

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <DEVDOCS_DIR>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\..\..\..\DevDocs'))</DEVDOCS_DIR> 
     <BUILTIN_MASTER>$(DEVDOCS_DIR)\jsd\enu\builtin_master.jsd</BUILTIN_MASTER> 
     <TOOLBOX_DIR>$(DEVDOCS_DIR)\Toolbox</TOOLBOX_DIR> 
     <JAWS_VER>17.0</JAWS_VER> 
     <!-- If perl.exe is not in your path, set the following variable to the full path and file name of perl.exe. 
     Optionally you could set the PERL_EXE environment variable. --> 
     <PERL_EXE Condition="'$(PERL_EXE)'==''">perl.exe</PERL_EXE> 
     <!-- If scompile.exe is not in your path, set the following variable to the full path and file name of scompile.exe. 
     Optionally you could set the SCOMPILE_EXE environment variable. --> 
     <SCOMPILE_EXE Condition="'$(SCOMPILE_EXE)'==''">scompile.exe</SCOMPILE_EXE> 
    </PropertyGroup> 
</Project> 

Scripts.targets

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="GenerateBuiltinJSD"> 
     <Exec Command="&quot;$(PERL_EXE)&quot; compilejsd.pl -v Jaws/$(JAWS_VER) -o &quot;$(MSBuildProjectDirectory)\builtin.jsd&quot; &quot;$(BUILTIN_MASTER)&quot;" WorkingDirectory="$(TOOLBOX_DIR)" /> 
    </Target> 
    <Target Name="CompileScripts"> 
     <Exec Command="&quot;$(SCOMPILE_EXE)&quot; /d &quot;%(ScriptSourceFiles.FullPath)&quot;" Outputs="%(ScriptSourceFiles.RootDir)%(ScriptSourceFiles.Directory)%(ScriptSourceFiles.Filename).jsb" WorkingDirectory="$(MSBuildProjectDirectory)" /> 
    </Target> 
    <Target Name="Clean"> 
     <ItemGroup> 
      <JSBFiles Include="$(MSBuildProjectDirectory)\*.jsb" /> 
     </ItemGroup> 
     <Delete Files="@(JSBFiles)" /> 
    </Target> 
    <Target Name="Build"> 
     <CallTarget Targets="GenerateBuiltinJSD;CompileScripts" /> 
    </Target> 
</Project> 

Scripts.vcxproj

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup Label="ProjectConfigurations"> 
    <ProjectConfiguration Include="Release|Win32"> 
     <Configuration>Release</Configuration> 
     <Platform>Win32</Platform> 
    </ProjectConfiguration> 
    </ItemGroup> 
    <ItemGroup> 
    <ScriptSourceFiles Include="Default.jss" /> 
    </ItemGroup> 
    <ItemGroup> 
    <ScriptMessageFiles Include="Default.jsm" /> 
    </ItemGroup> 
    <ItemGroup> 
    <ScriptHeaderFiles Include="HJConst.jsh" /> 
    </ItemGroup> 
    <ItemGroup> 
    <ScriptDocumentationFiles Include="default.jsd" /> 
    </ItemGroup> 
    <PropertyGroup Label="Globals"> 
    <ProjectGuid>{B2C4363D-D228-425D-AB04-38997EA229C0}</ProjectGuid> 
    </PropertyGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 
    <PropertyGroup Label="Configuration"> 
    <PlatformToolset>v120</PlatformToolset> 
    </PropertyGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> 
    <ImportGroup Label="PropertySheets"> 
    <Import Project="Scripts.props" /> 
    </ImportGroup> 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
    <Import Project="$(MSBuildProjectDirectory)\Scripts.targets" /> 
</Project> 

这个工程到一个点。问题是,当我执行构建时,即使相关源文件未更改,它也会重新构建所有脚本文件。

我的问题是我如何修改这个,以便每个文件只在必要时才被构建?

回答

1

您提到的功能称为Incremental Build,并希望它由MSBuild实用程序支持。您只需为没有源文件更改的计划跳过的目标指定输入和输出。

指定目标的输入和输出:使用目标元素的输入和输出属性。例如:

<Target Name="Build" 
    Inputs="@(CSFile)" 
    Outputs="hello.exe"> 

的MSBuild可以比较与输出文件的时间戳的输入文件的时间戳,并确定是否跳过,构建或重建部分的目标。

要在你的任务成功,你必须正常地生成输入输出目标的。这可以通过使用特殊的目标,这将填充所需物品,也可以使用显式的改造来实现:

<Target Name="CompileScripts" 
     Inputs="@(ScriptSourceFiles)" 
     Outputs="@(ScriptSourceFiles->'%(RootDir)%(Directory)%(FileName).jsb')"> 
    <Exec Command="&quot;$(SCOMPILE_EXE)&quot; /d &quot;%(ScriptSourceFiles.FullPath)&quot;" Outputs="%(ScriptSourceFiles.RootDir)%(ScriptSourceFiles.Directory)%(ScriptSourceFiles.Filename).jsb" WorkingDirectory="$(MSBuildProjectDirectory)" /> 
</Target> 

(另请注意,而不是引用%(RootDir)项的元数据,你应该使用$(OutDir)属性,因为它是更直接,但你应该确保这个属性是被指定的,并且在目标被执行时存在)。

相关问题