MSBuild.exeを使用して、コマンド行でASP.NET MVC4プロジェクトを「公開」する


82

MSBuild.exeMVC 4プロジェクトを取得して、指定されたディレクトリに公開するだけのコマンドに対して実行するコマンドを探しています。

例えば、

MSBuild <solution>/<project>.csproj -publish -output=c:/folder

これは明らかに間違った構文です。質問を単純化しようとしています。

この質問はビルドXMLについて話しますが、私はそれほど詳細に何もしようとはしていません。

単にデプロイしようとしています。

その質問のさらに下で、誰かが「MSDeploy」について話します。私はそれを調べることができますが、それが唯一の選択肢ですか?サーバーにWebデプロイをインストールする機能がありません。その場合、私が本当にする必要があるのは、「公開」して、公開されたプロジェクトのコンテンツをサーバー/ファイルシステム上の特定のディレクトリに送信することだけです。

誰かが私が使用できるワンライナーを持っていますか?

MSDeployを使用する必要がありますか?

MSDeployでは、サーバーにWeb展開をインストールする必要がありますか?

サーバーでWeb展開をセットアップするには、いくつかのポート、アクセス許可をセットアップし、いくつかのIISアドオンをインストールする必要はありませんか?

簡単なことを実行したいだけです。

回答:


152

VS 2012(およびAzure SDK for VS 2010で利用可能な公開更新プログラム)では、Webプロジェクトのコマンドライン公開が簡素化されました。これは、プロファイルの公開を使用して行いました。

WebプロジェクトのVSでは、公開ダイアログを使用して公開プロファイルを作成できます。そのプロファイルを作成すると、プロジェクトのProperties \ PublishProfilesの下に自動的に保存されます。作成したプロファイルを使用して、次のコマンドラインを使用してコマンドラインから公開できます。

msbuild mysln.sln /p:DeployOnBuild=true /p:PublishProfile=<profile-name>

公開プロファイル(.pubxmlファイル)を他の場所に保存する場合は、PublishProfileへのパスを渡すことができます。

公開プロファイルはMSBuildファイルです。公開プロセスをカスタマイズする必要がある場合は、.pubxmlファイル内で直接カスタマイズできます。

最終目標がコマンドラインからプロパティを渡すことである場合。以下をお勧めします。VSでサンプル公開プロファイルを作成します。その公開プロファイルを調べて、コマンドラインで渡す必要のあるMSBuildプロパティを決定します。参考までに、すべての公開メソッドがコマンドライン公開(つまりFTP / FPSE)をサポートしているわけではありません。

参考までに、.slnの代わりに.csproj / .vbprojをビルドしていて、VS 2012を使用している場合は、も渡す必要があります/p:VisualStudioVersion=11.0。理由の詳細については、http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspxを参照してください


3
OPは、Webアプリをローカルマシンの任意のフォルダーに「デプロイ」したいだけだと思います。
Richard Szalay 2012

3
したがって、展開サーバーでは、そのようなコマンドを機能させるためにVisual Studios IDEをインストールする必要がありますか?
Erik5388 2012

2
または、これを行うこともできます:microsoft.com/en-us/download/details.aspx
id

10
これはVS2013で機能しますか?同じコマンドラインを実行すると、発行は生成されません。エラーもありません。公開プロファイルでの単純なファイルシステム展開を使用したテスト。ビルドは機能しますが、公開結果はありません。宛先は空です。
レックスウィッテン2014年

2
これを使用すると、.pubxmlファイルに<LastUsedBuildConfiguration> Release </ LastUsedBuildConfiguration>が含まれていても、デバッグビルドが公開されます
reggaeguitar 2015

11

以下のようなbuild.xmlファイルを作成します

VisualStudioコマンドプロンプトを開始します

msbuildbuild.xmlを実行します

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">

  <PropertyGroup>
    <Build>$(MSBuildProjectDirectory)\Build</Build>
    <ProjectFile>MyProject.csproj</ProjectFile> 
    <ProjectName>MyProjectNameInVisualStudio</ProjectName>
    <CopyTo>$(MSBuildProjectDirectory)\CopyTo</CopyTo>
  </PropertyGroup> 

  <Target Name="Build"> 
    <RemoveDir Directories="$(Build)"/>  
    <MSBuild Projects="$(ProjectFile)" Properties="Configuration=Release;OutputPath=$(Build);OutDir=$(Build)/"></MSBuild>  
    <Exec Command="robocopy.exe  $(Build)\_PublishedWebsites\$(ProjectName) $(CopyTo) /e /is
      if %errorlevel% leq 4 exit 0 else exit %errorlevel%"/>    
  </Target>

</Project>

7
この答えは私にとって非常に役に立ちましたが、それを改善するために追加したいことが1つあります。記述どおりに実行すると、robocopyは終了コード1を返し、コピーが成功したことを示します... msbuildはビルドが失敗したと見なします。これを回避するには、robocopyコマンドの/ eの後に「if%errorlevel%leq 1 exit 0 else exit%errorlevel%」を追加するだけです。
アレックス

上記の答えとアレックスのコメントの両方が私に役立ちました。また、</ Target>の前に<RemoveDirDirectories = "$(CopyTo)" />を追加して、プロジェクトフォルダをクリーンに保ちます。
JackArbiter 2013

6

以下のコマンドは完璧に機能します。

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"

3
コンテンツファイルを公開したいだけの場合、これは機能します。しかし、web.config変換は実行されません
andreas 2015年

1
この方法は、MVC Webサイトの公開には機能しません(ビューはコピーされません)
eka808 2016

Web APIなどのWebアプリケーションの場合、2つの重要なファイルApp_global.asax.dllとApp_global.asax.compiledがbinフォルダーに生成されません。上記のSayedの例を使用することをお勧めします。
フレッドピーターズ

1

私は、答えはデフォルト構成、つまりデバッグを展開することであることがわかりました。公開プロファイルで選択された構成は、MSBuildによって無視されるようです。したがって、コマンドを変更して、展開の正しい構成を指定しました...

msbuild mysln.sln /p:Configuration=[config-name] /p:DeployOnBuild=true /p:PublishProfile=[profile-name]

ここで、config-name =リリースまたは作成したその他のビルド構成


0

Webプロジェクトでは、上記のようにビルドする必要がありますが、パッケージ化/コピーする必要もあります。「公開」ではなく、ファイルコピーを使用します...

また; DEBUG / RELEASEを使用してWebサイトを構築します。ただし、実際の環境、つまりweb.config変換を処理するための「QA」または「PROD」。

したがって、最初にRELEASEを使用してビルドし、次にQAを使用してパッケージ化します(以下の例)。

  <PropertyGroup>   
    <SolutionName>XXX.Website</SolutionName>
    <ProjectName>XXX.Website</ProjectName>
    <IisFolderName>XXX</IisFolderName>

    <SolutionConfiguration>QA</SolutionConfiguration> <!--Configuration will be set based on user selection-->   

    <SolutionDir>$(MSBuildThisFileDirectory)..</SolutionDir>
    <OutputLocation>$(SolutionDir)\bin\</OutputLocation>
     <WebServer>mywebserver.com</WebServer>
  </PropertyGroup>

  <Target Name="BuildPackage">
    <MSBuild Projects="$(SolutionDir)\$(SolutionName).sln" ContinueOnError="false" Targets="Clean;Rebuild" Properties="Configuration=Release" />
    <MSBuild Projects="$(SolutionDir)\$(ProjectName)\$(ProjectName).csproj" ContinueOnError="false" Targets="Package" Properties="Configuration=$(SolutionConfiguration);AutoParameterizationWebConfigConnectionStrings=False" />
  </Target>

  <Target Name="CopyOutput">
    <ItemGroup>
      <PackagedFiles Include="$(SolutionDir)\$(ProjectName)\obj\$(SolutionConfiguration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\$(WebServer)\$(IisFolderName)\$(SolutionConfiguration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
  </Target>

そう;

  1. プロパティを設定する
  2. BuildPackageターゲットを呼び出す
  3. CopyOutputターゲットを呼び出して出来上がり!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.