Хорошо известные метаданные + подстановочные знаки в MSBuild 3.5 - PullRequest
0 голосов
/ 18 октября 2010

В настоящее время я пытаюсь использовать MSBuild для настройки проекта, и у меня возникают некоторые проблемы с подстановочными знаками.

Я пытаюсь использовать следующий фрагмент:

<Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Xsd Include="App_Data\*.xsd">
      <Generator>MSDataSetGenerator</Generator>
      <LastGenOutput>%(Xsd.Filename).Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
    </Xsd>
    <Xss Include="App_Data\*.xss">
      <DependentUpon>%(Xss.Filename).xsd</DependentUpon>
    </Xss>
    <Xsc Include="App_Data\*.xsc">
      <DependentUpon>%(Xsc.Filename).xsd</DependentUpon>
    </Xsc>
  </ItemGroup>
  <Target Name="PrintMetaData">
    <Message Text="@(Xss->'%(DependentUpon)')"/>
  </Target>
</Project>

используя версию MSBuild 3.5, я получаю следующий вывод:

". xsd; .xsd; .xsd; ..... etc.xsd;"

с использованием версии 4.0 MSBuildЯ получаю ожидаемый результат: список имен файлов.

Кто-нибудь знает, если это известная проблема с обходным решением, или если есть патч для MSBuild, который мне не хватает?

Спасибо!

1 Ответ

2 голосов
/ 20 октября 2010

У меня была довольно похожая проблема. См .: Область и порядок оценки предметов в MsBuild .

С MSBuild до 4.0 вы не можете объявить элемент и установить некоторые из его метаданных путем одновременной пакетной обработки своих известных метаданных.

Не забывайте также, что элементы вне целей оцениваются один раз, в начале синтаксического анализа. Таким образом, вы не можете выполнять пакетирование за пределами целей с MSBuild до 4.0. Таким образом, обходной путь может заключаться в том, чтобы поместить вашу пакетную часть (или всю декларацию в вашу цель):

<Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <XsdFiles Include="App_Data\*.xsd">
      <Generator>MSDataSetGenerator</Generator>
      <SubType>Designer</SubType>
    </XsdFiles>
    <XssFiles Include="App_Data\*.xss" />
    <XscFiles Include="App_Data\*.xsc" />
  </ItemGroup>
  <Target Name="PrintMetaData">
    <ItemGroup>
      <Xsd Include="@(XsdFiles)">
        <LastGenOutput>%(XsdFiles.Filename).Designer.cs</LastGenOutput>
      </Xsd>
      <Xss Include="@(XssFiles)">
        <DependentUpon>%(XssFiles.Filename).xsd</DependentUpon>
      </Xss>
      <Xsc Include="@(XscFiles)">
        <DependentUpon>%(XscFiles.Filename).xsd</DependentUpon>
      </Xsc>
    </ItemGroup>
    <Message Text="@(Xss->'%(DependentUpon)')"/>
  </Target>
</Project>

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

...