我有一个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)......
我非常感谢任何输入。
答案 0 :(得分:0)
您应该熟悉msbuild评估过程,如here所述:
当MSBuild引擎开始处理构建文件时,它以自上而下的方式以多遍方式进行评估。这些过程按以下列表顺序描述:
- 加载所有环境和全局属性以及工具集属性。例如,在Microsoft Visual Studio 2010中,C ++在MSBuild 4.0工具集中定义了几个属性。
- 评估遇到的属性和流程导入
- 评估项目定义
- 评估项目
- 使用任务评估
- 开始构建和阅读目标
醇>
因此,在您的情况下,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的功能。