MSBuild Работа с ItemGroup и командой EXEC - PullRequest
2 голосов
/ 04 мая 2010

Я создал ItemGroup, показанную во фрагменте кода. Мне нужно перебрать эту ItemGroup и запустить команду EXEC - также показано в фрагменте кода. Я не могу заставить его работать. Код возвращает ошибку, показанную ниже (примечание: сообщение написано 2 раза, что правильно), но команда EXEC работает неправильно. Значение не устанавливается; поэтому EXEC не выполняется вообще. Мне нужно, чтобы EXEC выполнялся дважды или по тем разделам, которые я определил в ItemGroup.

ОШИБКА: Шифрование раздела «Настройки приложения WebServer» Шифрование раздела строки соединения WebServer C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_regiis.exe -pef "" "\ gaw \ UI" -пров "RSACustomProvider" Шифрование раздела конфигурации ... Раздел конфигурации '' не найден.

КОД SNIPPET:

<ItemGroup>
    <SectionsToEncrypt Include="Item">
      <Section>appSettings</Section>     
    </SectionsToEncrypt>
    <SectionsToEncrypt Include="Item">     
      <Section>connectionStrings</Section>
    </SectionsToEncrypt>  
  </ItemGroup>

  <Target Name="EncryptWebServerWebConfigSections">   
    <Message Text="Encrypting WebServer %(SectionsToEncrypt.Section) section" />

    <Exec Command="$(AspNetRegIis) -pef &quot;%(SectionsToEncrypt.Section)&quot; &quot;$(DropLocation)\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\$(AnythingPastFlavorToBuild)&quot; -prov &quot;$(WebSiteRSACustomProviderName)&quot;"/>
  </Target>

1 Ответ

5 голосов
/ 04 мая 2010

Проблема в том, что вы дозируете 2 продукта одновременно. Я имею в виду, что у вас есть заявления

%(SectionsToEncrypt.Section)
%(ConfigurationToBuild.FlavorToBuild)

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

Если у вашего FlavorToBuild есть только одно значение, вам нужно вставить это свойство в свойство перед вызовом Exec, а затем использовать это свойство. Таким образом, ваш один лайнер будет преобразован в:

<PropertyGroup>
    <_FlavToBuild>%(ConfigurationToBuild.FlavorToBuild)<_FlavToBuild>
</PropertyGroup>
<Exec Command="$(AspNetRegIis) -pef &quot;%(SectionsToEncrypt.Section)&quot; &quot;$(DropLocation)\$(BuildNumber)\$(_FlavToBuild)\$(AnythingPastFlavorToBuild)&quot; -prov &quot;$(WebSiteRSACustomProviderName)&quot;"/>

Если у вас есть несколько значений для FlavorToBuild, то это более сложно. У вас будет 2 варианта:

  1. Жесткий код Exec более одного раза
  2. Использование целевого пакетирования с пакетным заданием для выполнения foreach / foreach

Пакетирование - один из самых запутанных элементов MSBuild. Я собрал несколько онлайн-ресурсов на http://sedotech.com/Resources#batching. Если вы хотите узнать больше, вы можете взять копию моей книги .

...