как поддерживается иерархия свойств MS Build? - PullRequest
0 голосов
/ 07 марта 2011

Может кто-нибудь сказать мне, как MsBuild получает значение свойства .. ??

например.

<TempProperty>Property Value</TempProperty>

теперь я могу использовать $ (TempProperty) где угодно, чтобы получить его значение.

теперь сценарий таков, что я создал пользовательское задание с такой конфигурацией ..

<PropertyGroup>
    <ItemList>
      <ConfigChange>
        <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
        <Value>$(TempProperty)</Value>
        <IsList>False</IsList>
      </ConfigChange>
    </ItemList>
  </PropertyGroup>

теперь вместо получения значения свойства в теге я получаю $ (TempProperty) ... может кто-нибудь сказать мне, как получить фактическое значение в теге ???

заранее спасибо.

Эй, ребята, у меня тоже есть проблема и ее решение ... Я думаю, что я не смог описать мою проблему здесь .... Проблема была .. В своей пользовательской задаче я передавал путь к файлу файла содержащий вышеупомянутый тег ItemList .. теперь, когда я пытался проанализировать XMLNode "ItemList", он получал "$ (TempProperty)" как значение в Item ... и я думаю, что это правильно, потому что это то, что присутствует в переданном XML. 1015 *

Итак, чтобы преодолеть проблему, я сделал две вещи ..

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

спасибо за ваши ответы.

Ответы [ 3 ]

0 голосов
/ 07 марта 2011

Я только что попробовал это:

<Project 
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
  ToolsVersion="4.0"
  DefaultTargets="Demo" >

  <PropertyGroup>
    <TempProperty>property value</TempProperty>
    <ItemList>
      <ConfigChange>
        <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
        <Value>$(TempProperty)</Value>
        <IsList>False</IsList>
      </ConfigChange>
    </ItemList>
  </PropertyGroup>



  <Target Name="Demo">
    <Message Text="TempProperty: $(TempProperty)"/>
    <Message Text="ItemList: $(ItemList)"/>
  </Target>


</Project>

А мои результаты где:

Task "Message"
  TempProperty: property value
Done executing task "Message".
Task "Message"
  ItemList: 
  <ConfigChange xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
    <Value>property value</Value>
    <IsList>False</IsList>
  </ConfigChange>
Done executing task "Message".

Вы видите что-то еще?

0 голосов
/ 08 марта 2011

по предложению Ритча Я добавляю свое решение.

Изначально у меня было

<TempProperty>Property Value</TempProperty>

<PropertyGroup>
    <ItemList>
      <ConfigChange>
        <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
        <Value>$(TempProperty)</Value>
        <IsList>False</IsList>
      </ConfigChange>
    </ItemList>
  </PropertyGroup>

, теперь моя проблема заключалась в том, что я предоставлял часть файла свойств для своей пользовательской задачи

как

<UpdatePegasusConfigXML
      Environment="$(Environment)"
      Instance="$(Instance)"
      BuildSourceRoot="$(BuildSourceRoot)"
      ></UpdatePegasusConfigXML>

сейчас, так как я сам указывал путь к файлу, поэтому он взял значение, которое было помещено в тег «Значение», а не собирал значение свойства, поэтому на уровне кода я получал «$(TempProperty) "вместо« Значение свойства »

Теперь то, что я сделал, было вместо создания свойства Group. Я создал ItemGroup следующим образом

<ItemGroup>
    <PlaceHolders Include="#MACHINE_NAME#">
      <Value>$(TempProperty)</Value>
      <IsList>True</IsList>
    </PlaceHolders>
 </ItemGroup>

Теперь я обновил свою пользовательскую задачу, чтобы взять IteamGroup какодин из входов, таким образом, вызов изменился на

<UpdatePegasusConfigXML
      Environment="$(Environment)"
      Instance="$(Instance)"
      BuildSourceRoot="$(BuildSourceRoot)"
      PlaceHolders="@(PlaceHolders)"
      ></UpdatePegasusConfigXML>

, теперь на уровне кода я могу получить значение в теге «Value» ItemGroup.

Я надеюсь, что объяснил свойРешение, которое было понятно.

0 голосов
/ 07 марта 2011

Недостаточно, чтобы действительно диагностировать вашу проблему.На первый взгляд это выглядит правильно, но где объявлена ​​PropertyGroup для TempProperty?

В качестве иллюстративного примера приведен фрагмент из файла проекта C #:

     <?xml version="1.0" encoding="utf-8"?>
     <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
                <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
                 ...
        </PropertyGroup>

        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
            ...
        </PropertyGroup>

Для свойства конфигурации задано значение Debug (если в этот момент оно пустое).В следующей группе он отключает свойства Confuration и Platform.

Единственная хитрость в том, что для правильного отображения значения свойства его необходимо объявить перед использованием.

Пожалуйста, попробуйте предоставить немного больше контекста, который может помочь в понимании проблемы.

...