MSBuild Script и VS2010 публиковать применение Web.config Transform
Итак, у меня установлен VS 2010 и я в процессе изменения моего MSBuild script для нашей интеграции сборки TeamCity. Все отлично работает с одним исключением.
Как сообщить MSBuild, что я хочу применить файлы преобразования Web.conifg, которые я создал при публикации сборки...
У меня есть следующее, которое создает скомпилированный веб-сайт, но он выводит файлы Web.config, Web.Debug.config и Web.Release.config(все 3) в скомпилированный выходной каталог. В студии, когда я выполняю публикацию в файловой системе, она будет выполнять преобразование и выводит Web.config с соответствующими изменениями...
<Target Name="CompileWeb">
<MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" />
</Target>
<Target Name="PublishWeb" DependsOnTargets="CompileWeb">
<MSBuild Projects="myproj.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder);
OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" />
</Target>
Любая помощь будет отличной..!
Я знаю, что это можно сделать другими способами, но я хотел бы сделать это, используя, возможно, новый VS 2010
Ответы
Ответ 1
Я искал аналогичную информацию и не нашел ее, поэтому я немного искал файлы .targets, которые поставляются с Visual Studio 2010 и MSBuild 4.0. Я подумал, что это лучшее место для поиска задачи MSBuild, которая будет выполнять преобразование.
Насколько я могу сказать, используется следующая задача MSBuild:
<Project ToolsVersion="4.0"
DefaultTargets="Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml"
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
<PropertyGroup>
<ProjectPath>C:\Path to Project\Here</ProjectPath>
<DeployPath>C:\Path to Deploy\There</DeployPath>
<TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile>
<TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile>
<TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile>
<StackTraceEnabled>False</StackTraceEnabled>
</PropertyGroup>
<Target Name="Transform">
<TransformXml Source="$(TransformInputFile)"
Transform="$(TransformFile)"
Destination="$(TransformOutputFile)"
Condition="some condition here"
StackTrace="$(StackTraceEnabled)" />
</Target>
</Project>
Я тестировал вышеописанное и могу подтвердить, что он работает. Возможно, вам придется немного подстроить структуру, чтобы она соответствовала вашей компоновке script.
Ответ 2
Вы должны выполнить это, используя целевой объект Package и указав каталог temp.
msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish
http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/
Ответ 3
В качестве альтернативы вы пытаетесь использовать инструмент преобразования XDT:
http://ctt.codeplex.com
Я использую это вместо того, чтобы возиться с неясными целями msbuild. Работает с app.config не только web.config.
Ответ 4
Это сработало для меня со следующим изменением
<MSBuild Projects="$(ProjectFile)"
Targets="ResolveReferences;_WPPCopyWebApplication"
Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />
Из файла Microsoft.WebApplication.targets в папке MsBuild
_CopyWebApplication
This target will copy the build outputs along with the
content files into a _PublishedWebsites folder.
This Task is only necessary when $(OutDir) has been redirected
to a folder other than ~\bin such as is the case with Team Build.
The original _CopyWebApplication is now a Legacy, you can still use it by
setting $(UseWPP_CopyWebApplication) to true.
By default, it now change to use _WPPCopyWebApplication target in
Microsoft.Web.Publish.targets.
It allow to leverage the web.config trsnaformation.
Ответ 5
Это отличная запись о пользовательских преобразованиях:
http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild
Нам нужно было настроить веб-развертывания немного больше, чем обычно, из-за тонны классического ASP и других гадостей, которые нам пришлось приспособить. В этой статье были сохранены часы рытья по объектам MS.
Ответ 6
Я не эксперт в MSBuild, но я смог использовать информацию из этой ссылки для выполнения той же задачи:
http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
В нижней части статьи есть раздел, связанный с MSBuild. Надеюсь, это поможет.
Ответ 7
Еще один ответ на эту тему после нескольких дней поиска, прежде чем я решил эту проблему:
Ваш профиль публикации и имена конфигурации должны совпадать.
В моем случае мой не сделал. Публикация вручную через профиль публикации дала мне желаемый результат, потому что моя конфигурация была установлена в профиле публикации. MSBuild, однако, старается быть умным и волшебным образом соединяет профиль публикации и конфигурацию на основе имени. (Добавление /p: Configuration в команду привело к другим странным ошибкам в выходном пути ссылочного проекта).
Просто чтобы быть совершенно ясным в том, что я имею в виду:
Инструкция MSBuild из командной строки
msbuild myproject.csproj -t: Очистить -t: Перестроить /p: DeployOnBuild = true/p: PublishProfile = "Разработка"
РАБОТАЕТ
- Имя профиля публикации: Разработка
- Название конфигурации решения: Разработка
НЕ РАБОТАЕТ
- Имя профиля публикации: Разработка
- Название конфигурации решения: Dev
Надеюсь это поможет!