MSBuild Script и VS2010 публикуют приложение Web.config Transform. - PullRequest
70 голосов
/ 25 мая 2010

Итак, у меня установлена ​​VS 2010, и я нахожусь в процессе изменения моего сценария MSBuild для нашей интеграции сборки TeamCity. Все отлично работает, за одним исключением.

Как я могу сказать MSBuild, что я хочу применить файлы преобразования Web.conifg, которые я создал при публикации сборки ...

У меня есть следующее, которое создает скомпилированный веб-сайт, но выводит файлы Web.config, Web.Debug.config и Web.Release.config (All 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, если это возможно

Ответы [ 6 ]

63 голосов
/ 04 июня 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>

Я проверил вышеупомянутое и могу подтвердить, что это работает. Возможно, вам придется немного изменить структуру, чтобы она лучше подходила вашему сценарию сборки.

13 голосов
/ 15 июля 2010

Вы должны быть в состоянии сделать это, используя цель Package и указав временный каталог.

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/

8 голосов
/ 23 мая 2011

В качестве альтернативы вы пытаетесь использовать XDT Transformation Tool :

http://ctt.codeplex.com

Я использую это вместо того, чтобы связываться с неясными целями msbuild. Работает с app.config , а не только web.config .

5 голосов
/ 08 мая 2012

у меня сработало со следующим изменением

<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.
0 голосов
/ 02 мая 2019

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

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

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

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

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

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

РАБОТЫ

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

НЕ РАБОТАЕТ

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

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

0 голосов
/ 25 мая 2010

Я не специалист по MSBuild, но мне удалось использовать информацию по этой ссылке для выполнения той же задачи:

http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

В нижней части статьи есть раздел, связанный с MSBuild. Надеюсь, это поможет.

...