Скрипт MSBuild и VS2010 publish применяют преобразование Web.config
-
04-10-2019 - |
Вопрос
Итак, у меня установлен VS 2010, и я нахожусь в процессе модификации моего скрипта MSBuild для интеграции с нашей сборкой TeamCity.Все работает отлично, за одним исключением.
Как я могу сообщить MSBuild, что я хочу применить файлы преобразования Web.conifg, которые я создал при публикации сборки...
У меня есть следующее, которое создает скомпилированный веб-сайт, но оно выводит файлы Web.config, Web.Debug.config и Web.Release.config (все 3) в скомпилированный выходной каталог.В studio, когда я выполняю публикацию в файловой системе, она выполняет преобразование и выводит только 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, если это возможно
Решение
Я искал подобную информацию и не совсем ее нашел, поэтому я сделал несколько копающих в файлах .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>
Я проверил вышеперечисленное и могу подтвердить, что он работает. Возможно, вам нужно немного настроить структуру, чтобы лучше соответствовать сценарию сборки.
Другие советы
Вы должны быть в состоянии выполнить это, используя цель пакета и указав каталог Temp.
msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish
В качестве альтернативы вы пытаетесь использовать Инструмент преобразования XDT:
Я использую это, а не возиться с неясными целями MSBuild. Работает с app.config. не просто web.config..
Это работало для меня со следующими изменением
<MSBuild Projects="$(ProjectFile)"
Targets="ResolveReferences;_WPPCopyWebApplication"
Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />
От Microsoft.Webaplication.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.
Я не являюсь экспертом с MSBuild, но я смог использовать информацию из этой ссылки для достижения той же задачи:
Существует раздел, связанный с MSBuild рядом с нижней частью статьи. Надеюсь это поможет.
Еще один ответ на эту тему после того, как я искал несколько дней, прежде чем взялся за эту проблему:
Имена вашего профиля публикации и конфигурации должны совпадать.
В моем случае мой этого не сделал.Ручная публикация через профиль публикации дала мне желаемый результат, потому что моя конфигурация была задана в профиле публикации.MSBuild, однако, старается быть разумным и волшебным образом соединяет профиль публикации и конфигурацию на основе имени.(Добавление конфигурации /p: в команду привело к другим странным ошибкам в отношении выходного пути проекта, на который ссылается).
Просто чтобы было совершенно ясно, что я имею в виду:
Инструкция MSBuild из командной строки
msbuild myproject.csproj -t: Очистить -t: Перестроить /p: DeployOnBuild=true /p: PublishProfile="Разработка"
РАБОТАЕТ
- Опубликовать имя профиля:Развитие
- Имя Конфигурации решения:Развитие
НЕ РАБОТАЕТ
- Опубликовать имя профиля:Развитие
- Имя Конфигурации решения:Дев
Надеюсь, это поможет!