Как Опубликовать сеть с msbuild?

2010 Visual Studio имеет команду Publish, которая позволяет Вам публиковать свое веб-приложение Проект к местоположению файловой системы. Я хотел бы сделать это на своем сервере сборки TeamCity, таким образом, я должен сделать это с бегуном решения или msbuild. Я пытался использовать Опубликовать цель, но я думаю, что это могло бы быть для ClickOnce:

msbuild Project.csproj /t:Publish /p:Configuration=Deploy

Я в основном хочу сделать точно, что веб-проект развертывания делает, но без дополнения. Мне нужен он, чтобы скомпилировать WAP, удалить любые файлы, ненужные для выполнения, выполнить любые web.config преобразования и скопировать вывод в указанное местоположение.

Мое Решение, на основе ответа Jeff Siver


    
    

208
задан Sayed Ibrahim Hashimi 14 February 2012 в 13:29
поделиться

2 ответа

У меня он в основном работает без специального скрипта msbuild. Вот соответствующие параметры конфигурации сборки TeamCity:

Artifact paths: %system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp 
Type of runner: MSBuild (Runner for MSBuild files) 
Build file path: MyProject\MyProject.csproj 
Working directory: same as checkout directory 
MSBuild version: Microsoft .NET Framework 4.0 
MSBuild ToolsVersion: 4.0 
Run platform: x86 
Targets: Package 
Command line parameters to MSBuild.exe: /p:Configuration=Debug

Будет произведена компиляция, упаковка (с преобразованием web.config) и сохранение вывода как артефактов. Единственное, чего не хватает, - это копирования вывода в указанное место, но это можно сделать либо в другой конфигурации сборки TeamCity с зависимостью артефакта, либо с помощью скрипта msbuild.

Обновление

Вот сценарий msbuild, который скомпилирует, упакует (с преобразованием web.config) и скопирует вывод на мой промежуточный сервер

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
        <SolutionName>MySolution</SolutionName>
        <SolutionFile>$(SolutionName).sln</SolutionFile>
        <ProjectName>MyProject</ProjectName>
        <ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
    </PropertyGroup>

    <Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />

    <Target Name="BuildPackage">
        <MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
        <MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
    </Target>

    <Target Name="CopyOutput">
        <ItemGroup>
            <PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
        </ItemGroup>
        <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
    </Target>
</Project>

Вы также можете удалить свойства SolutionName и ProjectName из тега PropertyGroup и передать их в msbuild.

msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject

Обновление 2

Поскольку этот вопрос по-прежнему привлекает много трафика, я подумал, что стоит обновить свой ответ моим текущим сценарием, который использует Web Deploy (также известный как MSDeploy).

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
    <DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
  </PropertyGroup>

  <Target Name="VerifyProperties">
    <!-- Verify that we have values for all required properties -->
    <Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
  </Target>

  <Target Name="Build" DependsOnTargets="VerifyProperties">
    <!-- Deploy using windows authentication -->
    <MSBuild Projects="$(ProjectFile)"
             Properties="Configuration=$(Configuration);
                             MvcBuildViews=False;
                             DeployOnBuild=true;
                             DeployTarget=MSDeployPublish;
                             CreatePackageOnPublish=True;
                             AllowUntrustedCertificate=True;
                             MSDeployPublishMethod=RemoteAgent;
                             MsDeployServiceUrl=$(DeployServiceUrl);
                             SkipExtraFilesOnServer=True;
                             UserName=;
                             Password=;"
             ContinueOnError="false" />
  </Target>
</Project>

В TeamCity у меня есть параметры с именами env.Configuration , env.ProjectName и env.DeployServiceUrl . Средство выполнения MSBuild имеет путь к файлу сборки, и параметры передаются автоматически (вам не нужно указывать их в параметрах командной строки).

Вы также можете запустить его из командной строки:

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
136
ответ дан 23 November 2019 в 04:41
поделиться

Я не знаю TeamCity, поэтому надеюсь, что это сработает для вас.

Лучший способ, который я нашел для этого, это MSDeploy.exe. Это часть проекта WebDeploy под управлением Microsoft. Вы можете скачать биты здесь.

С WebDeploy вы запускаете командную строку

msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp

Это делает то же самое, что и команда VS Publish, копируя только необходимые биты в папку развертывания.

26
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: