Включить файл в проект в зависимости от конфигурации решения

Мне нужно включить файл в зависимости от конфигурации проекта, попробовал условия MSBuild, но, похоже, не работает

Я создал два файла и отредактировал .csproj, добавив следующие объявления

<ItemGroup>
    <AppxManifest Include="Package.debug.appxmanifest" Condition="'$(Configuration)'=='Debug'" >
      <SubType>Designer</SubType>
    </AppxManifest>
    <AppxManifest Include="Package.release.appxmanifest" Condition="'$(Configuration)'!='Debug'" >
      <SubType>Designer</SubType>
    </AppxManifest>
  </ItemGroup>

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


person Corrado Cavalli    schedule 23.08.2019    source источник
comment
Влияет ли это на вашу сборку или пакет? Любая ошибка? Потому что, как я знаю, пользовательский интерфейс не будет обновляться, пока вы не перезагрузите проект в этой ситуации, но при сборке и упаковке логика в вашем файле проекта может быть выполнена хорошо.   -  person LoLance    schedule 23.08.2019
comment
Ошибок нет, я вижу, что оба файла всегда включены (и, будучи приложением UWP, это не разрешено, и сборка внезапно завершается с ошибкой), попытался перезагрузить проект, перезапустить VS, но ничего не изменилось. Похоже, условие просто игнорируется.   -  person Corrado Cavalli    schedule 23.08.2019
comment
Похоже, что та же проблема была опубликована здесь, и правда в том, что Visual Studio не фильтрует файлы в зависимости от условия. stackoverflow.com/questions/8115696/ И у нас все еще есть такое поведение в VS2019...   -  person Corrado Cavalli    schedule 23.08.2019


Ответы (2)


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

1. Как мы знаем, пользовательский интерфейс в обозревателе решений соответствует содержимому файла .xxproj. Поэтому, когда я пишу контент, как показано ниже:

  <ItemGroup>
    <Content Include="TextFile1.txt" />
  </ItemGroup>

VS отобразит TextFile1.txt в обозревателе решений, даже если файл на самом деле не существует.

введите здесь описание изображения

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

2. И я думаю, что вас сильно смутило то, почему пользовательский интерфейс не включал файл в зависимости от конфигураций. Пожалуйста, взгляните на эту подобную проблему , я согласен с Андрей, что ItemGroup тоже влияет, но такое поведение. (Условия не работают при загрузке проекта)

3. И, на мой взгляд, когда VS загружает файл проекта и отображает пользовательский интерфейс в обозревателе решений, он не может получить доступ к значению конфигурации из переключателя. Поле переключателя отключено и серое, когда мой проект выгружен, и если я щелкну проект правой кнопкой мыши, чтобы перезагрузить его, поскольку теперь поле переключателя отключено, условия о конфигурациях не могут работать должным образом во время загрузки.

введите здесь описание изображения

Кроме того, я протестировал этот скрипт, теперь в обозревателе решений отображаются три файла:

  <ItemGroup>
    <Content Include="TextFile1.txt" Condition="$(RootNamespace)=='App'"/>
    <Content Include="TextFile2.txt" Condition="$(RootNamespace)=='AppApp'"/>
    <Content Include="TextFile3.txt" Condition="$(RootNamespace)=='AppAppApp'"/>
  </ItemGroup>

Таким образом, очевидно, что условия игнорируются во время загрузки. И согласно примечанию в примечания, так задумано.

А поскольку условия в этой ситуации не работают, возможно, вам придется установить его свойство вручную в окне свойств. то есть: установите действие сборки Package.release.appxmanifest как AppxManifest, а действие сборки Package.debug.appxmanifest None во время настройки выпуска.

Надеюсь, это поможет, и если я что-то не так понял, не стесняйтесь меня поправлять :)

Обновление 1:

Найдите обсуждение на github и получите хороший совет от давкеан.

Новая система проектов в настоящее время выводит дерево решений из "активной" конфигурации. Старая система проектов управляет деревом решений, игнорируя условия. У обоих есть свои преимущества и недостатки.

person LoLance    schedule 26.08.2019
comment
Спасибо, Ланс, за подробный ответ. - person Corrado Cavalli; 26.08.2019

Итак, вы должны включить оба файла в обе конфигурации, но вы можете выборочно установить флажок «Исключить из сборки» на основе конфигурации. Щелкните правой кнопкой мыши файл(ы) в обозревателе решений и откройте страницу «Свойства». Вы должны увидеть «Исключить из сборки», который вы можете проверить на наличие файла, который вам не нужен в выбранной конфигурации.

Затем, когда вы изменяете конфигурацию, обозреватель решений будет (должен) показывать один файл с добавленным значком «Нет входа», но отображаемый таким образом файл будет отличаться в каждой конфигурации.

person Adrian Mole    schedule 23.08.2019