我为项目提供了几个解决方案(插件),为每个解决方案定义了元数据范围
<ItemGroup>
<Plugins Include="Plugin1\Plugin1.sln">
<Disabled>false</Disabled>
<ProjectDirectory>plugin1\</ProjectDirectory>
<ProjectName>Plugin1</ProjectName>
</Plugins>
<Plugins Include="Plugin2\Plugin2.sln">
<Disabled>true</Disabled>
<ProjectDirectory>plugin2\</ProjectDirectory>
<ProjectName>Plugin2</ProjectName>
</Plugins>
<Plugins Include="Plugin3\Plugin3.sln">
<Disabled>false</Disabled>
<ProjectDirectory>plugin3\</ProjectDirectory>
<ProjectName>Plugin3</ProjectName>
</Plugins>
</ItemGroup>
我需要通过运行自己的构建脚本来构建非Disabled
插件,并将结果目录添加到Plugins元数据以进行后续处理(例如:将每个插件构建输出复制到自己的文件夹)。
但我无法找到连接它的方法。
低于我的目标:
<Target Name="BuildPlugin" Inputs="%(Plugins.Identity)" Outputs="%(Plugins.Identity -> %(PluginOutput.Identity))" Returns="%(PluginOutput.Identity)">
<MSBuild
Condition="!%(Disabled)"
Projects='%(ProjectDirectory)BuildProject.target'
Targets="Clean;Build;" >
<Output ItemName="PluginOutput" TaskParameter="TargetOutputs"/>
</MSBuild>
<ItemGroup>
<Plugins Condition="%(ProjectName)=%(Plugins.ProjectName)">
<PluginOutput>%(PluginOutput.Identity)</PluginOutput>
</Plugins>
</ItemGroup>
<Message Text="%(Plugins.ProjectName) %(PluginOutput.Identity)" Condition="%(Plugins.Disabled)" />
</Target>
BuildProject.target
返回输出目录(例如:Plugin1\Plugin1\bin\Release\
)
在这种情况下,buuilding失败并出现下一个错误:
错误MSB4096:项目列表&#34; PluginOutput&#34;没有为...定义值 元数据&#34; ProjectName&#34;。要使用此元数据,要么符合条件 它通过指定%(PluginOutput.ProjectName),或确保所有项目 在此列表中定义此元数据的值。
错误MSB4113:指定条件&#34;%(Plugins.Disabled)&#34;评估为 &#34;&#34;而不是布尔值。
但是如果删除ItemGroup
任务的Message
和条件
<Target Name="BuildPlugin" Inputs="%(Plugins.Identity)" Outputs="%(Plugins.Identity -> %(PluginOutput.Identity))" Returns="%(PluginOutput.Identity)">
<MSBuild
Condition="!%(Disabled)"
Projects='%(ProjectDirectory)BuildProject.target'
Targets="Clean;Build;" >
<Output ItemName="PluginOutput" TaskParameter="TargetOutputs"/>
</MSBuild>
<Message Text="%(Plugins.ProjectName) %(PluginOutput.Identity)" />
</Target>
似乎msbuild正确批量插件。 BuildPlugin
任务生成的Message
目标输出是:
BuildPlugin:
Plugin1
Plugin1\Plugin1\bin\Release\
BuildPlugin:
Plugin2
BuildPlugin:
Plugin3
Plugin3\Plugin3\bin\Release
但在这种情况下,我无法过滤禁用的插件并将插件输出文件夹添加到元数据中。
有什么想法吗?
答案 0 :(得分:0)
我无法测试所有步骤,因为缺少BuildProject.target,但这应该有效:
<Target Name="BuildPlugin"
Inputs="%(Plugins.Identity)"
Outputs="%(Plugins.Identity)\dummy.txt"
Returns="%(PluginOutput.Identity)">
<PropertyGroup> <!-- transform Metadata to Properties -->
<ProjectName>%(Plugins.ProjectName)</ProjectName>
<PluginDisabled>%(Plugins.Disabled)</PluginDisabled>
</PropertyGroup>
<MSBuild
Condition="'$(PluginDisabled)' != 'true'"
Projects='%(Plugins.ProjectDirectory)BuildProject.target'
Targets="Clean;Build;" >
<Output ItemName="PluginOutput" TaskParameter="TargetOutputs"/>
</MSBuild>
<ItemGroup>
<!-- batching 2 ItemGroups in one task is usually not working or creates side effects-->
<Plugins Condition="'%(PluginOutput.ProjectName)' == '$(ProjectName)'">
<PluginOutput>%(PluginOutput.Identity)</PluginOutput>
</Plugins>
</ItemGroup>
<!-- batching 2 ItemGroups in one task is usually not working or creates side effects-->
<Message Text="$(ProjectName) %(PluginOutput.Identity)" Condition="$(PluginDisabled)" />
</Target>