编译器在自定义目标中计算的附加选项

时间:2016-05-21 16:27:03

标签: msbuild msbuild-task compiler-options

我有一个msbuild自定义目标和一个计算值的任务。 任务将输出值作为属性。 这个属性我想用作编译器调用的附加选项。

但是当用作附加选项时,该属性为空。

我的 *。目标文件如下所示:

$reference = array(
             'companyId' => '*********',
             'secureKey' => '*********'
        );

        $client = new SoapClient('http://www.tadawul.com.sa/Tadawul_WebAPI/services/GetDetailQuote?wsdl');
        $response = $client->getDetailQuoteForCompany($reference);
        var_dump($response);

我的 *。道具文件是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="GetBranchName_TASK" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup>
        <sPath ParameterType="System.String" Required="true" />
        <sBranchName ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
      <Code Type="Fragment" Language="cs">
        <![CDATA[
            ... some Code ...
        ]]>
      </Code>
    </Task>
  </UsingTask>

  <Target Name="GetBranchName_TARGET">
    <GetBranchName_TASK sPath="$(MSBuildThisFileDirectory)">
      <Output PropertyName="BranchName" TaskParameter="sBranchName" />
    </GetBranchName_TASK>
    <Message Importance="High" Text="BranchName = $(BranchName)" />
  </Target>

  <PropertyGroup>
    <BuildDependsOn>
        GetBranchName_TARGET;
        $(BuildDependsOn);
    </BuildDependsOn>
  </PropertyGroup>
</Project>

然后将 .props 文件导入到多个 .vcxproj < / p>

GetBranchName_TARGET 中打印为消息的值按预期正确显示(显示正确的TFS分支名称)。 但是当查看详细构建输出时,值似乎为空:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Label="Configuration">
    ... some Properties here ...
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <Import Project="IRSGetBranchName.targets" /> 
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalOptions>/DBRANCHNAME=$(BranchName) /DMORE=BAR</AdditionalOptions>
    <ClCompile>
  <ItemDefinitionGroup>
</Project>

我试了好几个小时但没找到解决方案,我真的希望有人帮忙,这里错了......

a)Property BranchName 在全球范围内不可用吗?我尝试从其他自定义目标打印属性,但效果很好!

b)或者,在我的目标被执行之前, ClCompile.AdditionalOptions 是否已评估/构建?在这种情况下,我该如何重新评估?

c)......

我非常感谢任何输入。

1 个答案:

答案 0 :(得分:0)

您应该熟悉msbuild评估过程,如here所述:

  

当MSBuild引擎开始处理构建文件时,它以自上而下的方式以多遍方式进行评估。这些过程按以下列表顺序描述:

     
      
  1. 加载所有环境和全局属性以及工具集属性。例如,在Microsoft Visual Studio 2010中,C ++在MSBuild 4.0工具集中定义了几个属性。
  2.   
  3. 评估遇到的属性和流程导入
  4.   
  5. 评估项目定义
  6.   
  7. 评估项目
  8.   
  9. 使用任务评估
  10.   
  11. 开始构建和阅读目标
  12.   

因此,在您的情况下,ItemDefinitionGroup ClCompile已在 GetBranchName_TARGET 执行之前进行了评估。所以,它在设计上是空的。

为了实现所需的行为,您应该添加以下内容:

<Target Name="GetBranchName_TARGET">
  <GetBranchName_TASK sPath="$(MSBuildThisFileDirectory)">
    <Output PropertyName="BranchName" TaskParameter="sBranchName" />
  </GetBranchName_TASK>
  <Message Importance="High" Text="BranchName = $(BranchName)" />
  <ItemGroup>
    <ClCompile>
      <AdditionalOptions>/DBRANCHNAME=$(BranchName) /DMORE=BAR</AdditionalOptions>
    </ClCompile>
  </ItemGroup>
</Target>

例如,您可以在ClCompile中使用Condition属性,以便仅包含您的来源。实际上,您正在寻找的是修改item metadata after it was declared的功能。