Как извлечь каталог из свойства?

У меня есть свойство GroupProj, сохраняющее полное имя пути. Как я могу извлечь каталог свойства?

У меня есть следующий код, но он не работает должным образом:

<propertygroup>
 <groupproj>C:\development\project\default.groupproj</groupproj> 
</propertygroup>
<target name="Default">
 </target>

Я опишу свое фактическое намерение сделать это. Возможно, есть способ сделать работу, о которой я не знаю.

У меня есть проект Delphi groupproj (проект MSBuild), C:\development\project\default.groupproj:

<project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <itemgroup>
 <projects include="project1.dproj">
 <dependencies>
 </dependencies></projects>
 <projects include="project2.dproj">
 <dependencies>
 </dependencies></projects>
 <projects include="project3.dproj">
 <dependencies>
 </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">
 </msbuild></target>
</import></project>

И выполните как:

c:\> msbuild /p:GroupProj="C:\development\project\default.groupproj" test.targets

Выполнение не выполняется, поскольку MSBuild не может найти файл projectN.dproj. Проблема заключается в том, что рабочий каталог не установлен на default.groupproj.

На мой взгляд, прямое решение состоит в извлечении каталога $(GroupProj) и concat там projectN.dproj файла.

Вот вся история моего вопроса.

1 ответ

Попробуйте что-то вроде этого:

<!--?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">
 </output></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)">
 </message></message></message></message></message></message></target>
</project>

EDIT:

Чтобы параллельно строить проекты, попробуйте следующее:

<!--?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)')">
 </groupprojpath></groupproj></itemgroup>
 <propertygroup>
 <groupprojpath>@(GroupProjPath->'%(RootDir)%(Identity)')</groupprojpath>
 </propertygroup>
 </target>
 <import project="$(GroupProj)">
 <target name="GetDProjs" dependsontargets="GetGroupProjPath">
 <itemgroup>
 <dprojs include="@(Projects->'$(GroupProjPath)%(FileName)%(Extension)')">
 </dprojs></itemgroup>
 </target>
 <target name="Build" dependsontargets="GetDProjs">
 <message text="@(DProjs)">
 </message></target>
</import></project>

licensed under cc by-sa 3.0 with attribution.