2009-09-03 2 views
11

Как сохранить значения, определенные в одной цели сборки, в другом таргетинге? Если PropertyGroup не является объектом записи MsBuild, я должен использовать здесь, что это такое? ReleaseDir печатается нормально в цель «пакета», но пусто в «DoPackage»Передача значения группы свойств из одной задачи MsBuild в другую

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDirBase> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleaseDir)')"/> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

ответ

21

Существует well known issue со свойствами и задачи CallTarget. Вместо этого вы должны использовать DependsOnTargets.

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleasesDir)"/> 
</Target> 

<Target Name="PrePackage" DependsOnTargets="Package"> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleasesDir)')"/> 
</Target> 

<!-- Do the actual packaging --> 
<Target Name="DoPackage" DependsOnTargets="Package"> 
    <Message Text="Creating package in '$(ReleasesDir)'"/> 
    <Error Condition="'$(ReleasesDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleasesDir)"/> 
</Target> 
+0

Я бы хотел, чтобы DoPackage работал только в том случае, если ReleaseDir существует (для этого я использовал условие в CallTarget). Могу ли я достичь этого с помощью DependsOnTarget? – ripper234

+0

Теперь, когда я действительно прочитал ссылку, которую вы опубликовали, решение прост - я написал отдельную задачу под названием «DefineProperties», и после ее завершения свойства ... определены. Благодарю. – ripper234

+0

Да, это решение, я обновил образец. –

1

Если кто-то хочет передать свойство цели, задача MSBuild может быть полезна. Это единственный способ вызывать цель несколько раз с разными значениями свойств, но не позволяет передавать элементы или группы элементов. См. Это comment в теме, к которой относится Жюльен.

... [C] вся цель MSBuild на нем снова, на этот раз передающая требуемые свойства. Это обходит инкрементное здание ..., но имеет множество ограничений, а именно: вы не можете передавать элементы, и вы должны указать, какие свойства необходимо передать.

Вот что ваш фрагмент кода будет выглядеть с помощью задачи MSBuild:

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="DoPackage" Properties="ReleaseDir=$(ReleaseDir)" /> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

Этот метод полезен, если вы хотите использовать объект как подпрограмму, которую можно назвать несколько раз с разными значения параметров. Например, для вызова процесса сборки для нескольких конфигураций продукта.

1

Это может быть не самым чистым способом решить эту проблему, но если кто-то еще хочет использовать CallTarget на файл сборки, он/она должен определить PropertyGroup в другом Target, следующее решение этой странная проблема.

<Target Name="DebugBuild" DependsOnTargets="DebugBuildProp"> 
    <CallTarget Targets="CompileSolution"/> 
</Target> 
<Target Name="DebugBuildProp"> 
    <PropertyGroup> 
    <Configuration>Debug</Configuration> 
    </PropertyGroup> 
</Target> 
<Target Name="CompileSolution"> 
    <Message Text="$(Configuration)" /> 
</Target> 
+0

Если 'DeugBuild' обновляет значение' Configuration', ' CompileSolution' по-прежнему не будет использовать новое значение. – makhdumi

+0

@ Al-Muhandis Это действительно так, я не знаю, почему, но если вы определяете Свойство на цели зависимостей, все остальные цели, которые вы вызываете с помощью CallTarget, будут иметь значение. Попробуй сам –

Смежные вопросы