1. ホーム
  2. asp.net

[解決済み】msbuildでWeb公開する方法とは?

2022-05-04 01:03:43

質問

Visual Studio 2010 には Publish コマンドがあり、Web アプリケーション プロジェクトをファイル システムの場所に公開することができます。TeamCityビルドサーバーでこれを行いたいので、ソリューションランナーまたはmsbuildで行う必要があります。Publish ターゲットを使ってみましたが、これはClickOnce用かもしれませんね。

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

私は基本的に、ウェブ展開プロジェクトが行うことと全く同じことを、アドインなしで行いたいと思っています。WAPをコンパイルし、実行に不要なファイルを削除し、すべての web.configの変換 そして、その出力を指定された場所にコピーします。

私の解決策 ジェフ・シバー氏の回答に基づいています。

<Target Name="Deploy">
    <MSBuild Projects="$(SolutionFile)" 
             Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package" 
             ContinueOnError="false" />
    <Exec Command="&quot;$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd&quot; /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" 
          ContinueOnError="false" />
</Target>

解決方法は?

カスタムmsbuildスクリプトを使わずに、ほぼ動作するようになりました。以下は、関連するTeamCityのビルド構成設定です。

Artifact paths: %system.teamcity.build.workingDir%MyProject³obj³Debug³Package³PackageTmp 
ランナーの種類 MSBuild (MSBuildファイル用ランナー) 
ビルドファイルのパス MyProjectMyProject.csproj 
作業ディレクトリ: チェックアウト ディレクトリと同じ 
MSBuildのバージョンです。マイクロソフト .NET フレームワーク 4.0 
MSBuild ToolsVersion: 4.0 
実行プラットフォーム: x86 
ターゲット パッケージ 
MSBuild.exeへのコマンドラインパラメータ。/p:Configuration=Debug

これにより、コンパイル、パッケージング(web.config の変換を伴う)、および成果物としての保存が行われます。唯一足りないのは、出力を指定した場所にコピーすることですが、これはアーティファクトに依存する別の TeamCity ビルド設定か msbuild スクリプトで行うことができます。

アップデート

以下は、コンパイル、パッケージング(web.configの変換を含む)、そして出力をステージングサーバーにコピーするmsbuildスクリプトです。

<?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>

また、PropertyGroup タグから SolutionName と ProjectName のプロパティを削除して、msbuild に渡すこともできます。

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

アップデート2

この質問にはまだかなりのトラフィックがあるので、私の回答を更新する価値があると思い、現在使用しているスクリプトで ウェブデプロイ (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.ProjectNameenv.DeployServiceUrl . MSBuildランナーはビルドファイルのパスを持ち、パラメータは自動で渡されます(Command line parametersで指定する必要はありません)。

また、コマンドラインから実行することも可能です。

msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService