MSBuild: Как включить и «* .xaml» и «* .cs» в сборку Silverlight? - PullRequest
5 голосов
/ 10 августа 2010

Я хочу использовать MSBuild для захвата и создания соответствующих элементов для 2 файлов. Если бы это было только одно расширение файла, я бы использовал:

<ItemGroup>
    <Compile Include="\Pages\*.cs" /> 
</ItemGroup>

В файле .csproj для сборки Silverlight каждый элемент UserControl устанавливается так же, как и со своим собственным элементом <Compile> и дочерним элементом <DependentUpon>:

<ItemGroup>
    <Compile Include="Pages\SilverlightControl1.xaml.cs">
        <DependentUpon>SilverlightControl1.xaml</DependentUpon>
    </Compile>
    <Compile Include="Pages\SilverlightControl2.xaml.cs">
        <DependentUpon>SilverlightControl2.xaml</DependentUpon>
    </Compile>
</ItemGroup>

В файле MSBuild я хотел бы указать:

захватить все файлы .cs и положить их в Include атрибут и получить то же имя файла - минус .cs и положить его в элемент <DependentUpon>.

Так что это будет что-то вроде (псевдо) для сопоставления пар файлов:

<ItemGroup>
    <Compile Include="Pages\*.cs">
        <DependentUpon>Pages\*.xaml</DependentUpon>
    </Compile>
</ItemGroup>

Есть ли способ сделать это в MSBuild?

Ответы [ 2 ]

4 голосов
/ 10 августа 2010

MSBuild имеет два отдельных свойства метаданных: %(Filename) (это имя файла без расширения) и %(Extension), которые в вашем примере будут ".cs".Итак, мне интересно, возможно ли это:

<ItemGroup>
    <Compile Include="Pages\*.cs">
        <DependentUpon>%(Directory)%(Filename)</DependentUpon>
    </Compile>
</ItemGroup>

Но я не думаю, что вам понравится то, что он собирается делать, или даже делать то, что вы хотите, чтобы он делал.

У вас действительно должны быть когда-либо только предметы типа "глобус" (* .cs) в пределах цели - вы не должны объявлять ее как группу предметов верхнего уровня, иначе она будет делать забавные вещив Visual Studio и (например) добавит все файлы .cs для контроля версий и, возможно, даже расширит * .cs на отдельные элементы в вашем проекте.

Вот что я хотел бы предложить в проекте MSNbuild NON Visual Studio:

<Target Name="PrepareCompileItems">
    <XamlFiles Include="Pages\*.cs">
        <DependentUpon>%(Directory)%(Filename)</DependentUpon>
    </XamlFiles>

    <Compile Include="@(XamlFiles)" />
</Target>

Если вы делали это в проекте VS, то это сложнее - потому что вы хотите добавить метаданные для уже существующей группы элементов, чтобы принудительно установить ассоциацию зависимого бонуса перед компиляцией:

<Target Name="AddDependentUponMetadata">
    <CsFiles Include="Pages\*.cs" />

    <XamlFiles Include="@(CsFiles)">
        <DependentUpon>%(Directory)%(Filename)</DependentUpon>
    </XamlFiles>

    <Compile Remove="@(CsFiles)" />    
    <Compile Include="@(XamlFiles)" />
</Target>

Хотя я набираю это без проверки моих утверждений, поэтому YMMV ...

2 голосов
/ 10 августа 2010

В MsBuild вы можете сделать следующее:

<ItemGroup>
        <ClassFiles Include="**\*.cs"/>
        <XamlFiles Include="**\*.xaml"/>
        <Compile  Include="@(ClassFiles)" > 
            <DependentUpon>"@(XamlFiles)"</DependentUpon>
        </Compile>
     </ItemGroup>

Это то, что вы хотите, или я далек от вашего вопроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...