Условие MSBuild для предотвращения преобразования XML app.config

Я использую расширение VS «SlowCheetah» для преобразования нашего app.config с различными значениями в зависимости от конфигурации проекта. Таким образом, конфигурация «Отладка» создает файл app.config со значениями, подходящими для пользователей Dev/Qa, а сборка «Выпуск» создает файл app.config с производственными значениями.

.csproj содержит такой раздел:

<ItemGroup>
<None Include="App.config">
  <SubType>Designer</SubType>
  <TransformOnBuild>true</TransformOnBuild>
</None>
<None Include="App.Debug.config">
  <DependentUpon>App.config</DependentUpon>
  <IsTransformFile>True</IsTransformFile>
  <SubType>Designer</SubType>
</None>    
<None Include="App.Release.config">
  <DependentUpon>App.config</DependentUpon>
  <IsTransformFile >True</IsTransformFile>    
</None>
<None Include="packages.config" />
<None Include="Properties\SlowCheetah\SlowCheetah.Transforms.targets" />

And the msbuild logic is contained mostly in the 'SlowCheetah.Transforms.targets' file. My files are being transformed correctly.

Я хочу защититься от случайного запуска разработчиком сборки Release в Visual Studio и непреднамеренного запуска моего приложения с рабочим файлом конфигурации. Моя идея состоит в том, чтобы использовать условие msbuild, возможно, что-то вроде:

Condition=" '$(BuildingInsideVisualStudio)'=='true' "

Я безуспешно пытался использовать это условие в нескольких местах файла .csproj. Я подозреваю, что смогу заставить это работать, если изменю сам файл «SlowCheetah.Transforms.targets», но этот файл не следует изменять в соответствии с комментариями вверху.

В идеале я хотел бы, чтобы ВСЕ конфигурации для сборок внутри Visual Studio использовали мой файл конфигурации отладки, а сборки «Выпуск» вне Visual Studio (например, сборки на сервере непрерывной интеграции) использовали Prod app.config, но я бы согласился на возможность предотвратить случайный запуск сборки «Release» внутри Visual Studio. Любые предложения относительно того, можно ли/как этого добиться, приветствуются.


person JMc    schedule 23.01.2017    source источник


Ответы (1)


Добавьте это непосредственно перед </Project>:

  <Target Name="BeforeBuild">
    <Error Condition=" '$(BuildingInsideVisualStudio)'=='true' And '$(Configuration)'=='Release' "
           Text="JMc is so mad at you you trying to build using the Release configuration from Visual Studio." />
  </Target>
person weir    schedule 24.01.2017
comment
Красиво делает работу. Спасибо. - person JMc; 25.01.2017
comment
Хорошей альтернативой тому же условию является указание значений DEV в app.config и отдельное преобразование для конфигурации «Выпуск». Затем поместите «Условие» в группу свойств «SlowCheetah». В результате преобразование происходит только при сборке вне VS. При сборке внутри VS вы всегда получаете файл app.config DEV. - person JMc; 25.01.2017
comment
‹PropertyGroup Condition= '$(Configuration)' != 'Release' ИЛИ ​​'$(BuildingInsideVisualStudio)'=='false' Label=SlowCheetah› ‹SlowCheetahToolsPath›$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory )\..\packages\SlowCheetah.2.5.15\tools))‹/SlowCheetahToolsPath›.... - person JMc; 25.01.2017