Преобразование файла 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
Надеюсь это поможет!