如何从属性中提取目录?
我有一个财产GroupProj
存储完整的路径名称。我怎样才能提取属性的目录?如何从属性中提取目录?
我有下面的代码,但预期它不工作:
<PropertyGroup>
<GroupProj>C:\development\project\default.groupproj</GroupProj>
</PropertyGroup>
<Target Name="Default">
<Message Text="Echo: $(GroupProj->'%(RootDir)')" />
</Target>
我将介绍我这样做的实际意图。也许有办法做我不知道的工作。
我有一个Delphi
groupproj(MSBuild项目)文件,C:\development\project\default.groupproj
:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Projects Include="project1.dproj">
<Dependencies/>
</Projects>
<Projects Include="project2.dproj">
<Dependencies/>
</Projects>
<Projects Include="project3.dproj">
<Dependencies/>
</Projects>
</ItemGroup>
...
</Project>
还有其他3个MSBuild
文件(project1.dproj
,project2.dproj
和project3.dproj
)保存在同一文件夹中default.groupproj
。
我创建一个MSBuild
项目文件(C:\ test.targets):
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="3.5">
<Import Project="$(GroupProj)" />
<Target Name="Build">
<MSBuild BuildInParallel="True" Projects="project1.dproj;project2.dproj;project3.dproj"/>
</Target>
</Project>
而作为执行:
c:\> msbuild /p:GroupProj="C:\development\project\default.groupproj" test.targets
执行应为MSBuild
失败找不到projectN.dproj
文件。问题应该是工作目录未设置为default.groupproj
。
进入我脑海的一个直接解决方案是提取$(GroupProj)目录并将concat文件提取到那里projectN.dproj
文件。
这就是我的问题的全部内容。
尝试是这样的:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<GroupProj>C:\development\project\default.groupproj</GroupProj>
</PropertyGroup>
<Target Name="Build">
<CreateItem Include="$(GroupProj)">
<Output TaskParameter="Include" ItemName="ItemFromProp"/>
</CreateItem>
<Message Text="1. @(ItemFromProp -> '%(RootDir)%(Directory)')"/>
<Message Text="2. %(ItemFromProp.RootDir)%(ItemFromProp.Directory)"/>
<Message Text="3. %(ItemFromProp.Identity)"/>
<Message Text="4. %(ItemFromProp.FullPath)"/>
<Message Text="5. %(ItemFromProp.FileName)"/>
<Message Text="6. %(ItemFromProp.Extension)"/>
</Target>
</Project>
编辑:
要构建并行项目试试这个:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="GetGroupProjPath">
<ItemGroup>
<GroupProj Include="$(GroupProj)" />
<GroupProjPath Include="@(GroupProj->'%(Directory)')" />
</ItemGroup>
<PropertyGroup>
<GroupProjPath>@(GroupProjPath->'%(RootDir)%(Identity)')</GroupProjPath>
</PropertyGroup>
</Target>
<Import Project="$(GroupProj)" />
<Target Name="GetDProjs" DependsOnTargets="GetGroupProjPath">
<ItemGroup>
<DProjs Include="@(Projects->'$(GroupProjPath)%(FileName)%(Extension)')" />
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="GetDProjs">
<Message Text="@(DProjs)" />
</Target>
</Project>
@ChauCheeYang我知道上面的例子可以解答你的问题,但它并不能解决你的问题。如果你不想解决你的问题,你应该打电话给默认。因为.group proj是一个msbuild项目,或者你应该尝试从这里的答案http://*.com/questions/9865641/build-modules/smsppild.mspild直接与MsBuild的msbuild“C:\开发\项目\ default.groupproj” all-projects-in-a-directory – Rolo 2014-12-03 15:49:06
我正在使用多核CPU。来自'Delphi'的default.groupproj不会并行构建所有的'dproj's。任何时候只执行一项任务。我正在考虑使用'BuildInParallel'从最初的'default.groupproj'派生一个新的'msbuild' groupproj。 – 2014-12-03 21:39:03
@ChauCheeYang看看我的编辑。这应该有助于您并行地构建项目。 – Rolo 2014-12-04 00:16:10
尽量只'%(RootDir))“/>'。关闭选民,这不是重复的! OP希望在MSBuild中打印出一个['知名的项目'](http://msdn.microsoft.com/en-us/library/ms164313.aspx)'%(RootDir)'。 – TLama 2014-12-03 09:50:02
@TLama谢谢你纠正我。德尔福的标签让我感到困惑。我已经删除它。 – 2014-12-03 10:07:10
@Chau,你究竟会回应什么?你可以只为项目获得那些众所周知的元数据(节点''),但是我不清楚你要输出什么。请你详细说明一下吗? –
TLama
2014-12-03 11:08:33