Преобразование файла web.config из командной строки

У меня есть две среды построения для таргетинга; Освобождение и постановка. Web.config выглядит следующим образом:

<system.web>     
    <authentication mode="Windows">
    </authentication>

    <authorization>
        <deny users="?" />
    </authorization>
</system.web>

Я хочу преобразовать его, построив конфигурацию: Web.Staging.config

<system.web>     
    <authentication mode="Windows">
    </authentication>

    <authorization xdt:Transform="Replace">
        <deny users="?" />
        <allow roles="StagingRoles" />
        <deny users="*" />
    </authorization>
</system.web>

Я строю из командной строки следующим образом:

msbuild buildscript.build /p:Configuration=Staging

После сборки я не вижу файл web.config, преобразованный в папку сборщика артефактов. Здесь что-то не так?

Спасибо

Ответ 1

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

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<Target Name="BeforeBuild">
    <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

Изменить: В ответ на ваш комментарий вы должны использовать Web.config в качестве исходного параметра в задаче TransformXml (см. шаг № 2). Если вы хотите выполнить конфигурационное преобразование в сборке script, выполните следующие инструкции:

1) Импортируйте WebApplication.targets в свою сборку script следующим образом:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

2) Выполните задачу сборки TransformXml в своей целевой компоновке script:

<Target Name="MyBuildScriptTarget">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
    ...other build tasks...
</Target>

Ответ 2

Ответ Джонатана - это хорошо. Я слегка изменил его, чтобы сохранить исходный файл Web.config. Это строки, которые я добавил в нижней части моего файла .csproj:

  <!-- the step to copy the config file first avoids a 'File is being used by another process' error -->
  <Target Name="BeforeBuild">
    <Copy SourceFiles="Web.config" DestinationFiles="Web.temp.config" OverwriteReadOnlyFiles="True" />
    <TransformXml Source="Web.temp.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
  </Target>
  <Target Name="AfterBuild">
    <Copy SourceFiles="Web.temp.config" DestinationFiles="Web.config" OverwriteReadOnlyFiles="True" />
    <Delete Files="Web.temp.config" />
  </Target>

Я вижу, что файл web.config преобразуется путем запуска сборки в Visual Studio (или из командной строки).

Ответ 3

Небольшое улучшение по сравнению с ответом Джонатана:

Использование этой строки ниже для импорта веб-целей позволит быть совместимым с любой версией Visual Studio. Обратите внимание, что это не связано с версией v10.0

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />

Ответ 4

Используя преобразование Build с Jenkins, я также вижу, что web.config не преобразуется, однако фактическое преобразование происходит, когда вы выполняете развертывание. Я использую все в одной команде msbuild для сборки и развертывания вместе.

MSBuild MyProj.csproj /P:Configuration=Release /P:DeployOnBuild=True /P:DeployTarget=MsDeployPublish /P:MsDeployServiceUrl=https://your server/msdeploy.axd /P:AllowUntrustedCertificate=True /P:MSDeployPublishMethod=WMSvc /P:CreatePackageOnPublish=True /P:UserName=username /P:Password=password1 /P:DeployIISAppPath="Default Web Site or name of your website"

и после этого вы можете проверить на сервере, что преобразование происходит.

Ответ 5

Еще один ответ на эту тему после нескольких дней поиска, прежде чем я решил эту проблему:

Ваш профиль публикации и имена конфигурации должны совпадать.

В моем случае мой не сделал. Публикация вручную через профиль публикации дала мне желаемый результат, потому что моя конфигурация была установлена в профиле публикации. MSBuild, однако, старается быть умным и волшебным образом соединяет профиль публикации и конфигурацию на основе имени. (Добавление /p: Configuration в команду привело к другим странным ошибкам в выходном пути ссылочного проекта).

Просто чтобы быть совершенно ясным в том, что я имею в виду:

Инструкция MSBuild из командной строки

msbuild myproject.csproj -t: Очистить -t: Перестроить /p: DeployOnBuild = true/p: PublishProfile = "Разработка"

РАБОТАЕТ

  • Имя профиля публикации: Разработка
  • Название конфигурации решения: Разработка

НЕ РАБОТАЕТ

  • Имя профиля публикации: Разработка
  • Название конфигурации решения: Dev

Надеюсь это поможет!