2012-12-17 25 views
67

MSBuild.exeに対して実行するコマンドを探しています。このコマンドはMVC 4プロジェクトを受け取り、特定のディレクトリに公開します。例えばMSBuild.exeを使用して、コマンド行でASP.NET MVC 4プロジェクトを公開する

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

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

This questionビルドXMLの話がありますが、私はそれほど詳細を何もしていません。

私は単に展開を試みています。

さらにthat questionがダウンしていると、誰かが「MSDeploy」と発声します。私はそれを見ることができますが、それは唯一の選択肢ですか?私はサーバーにWebを展開する機能を持っていません。その場合、私が本当にやるべきことは、「公開」して、公開されたプロジェクトの内容をサーバー/ファイルシステムの特定のディレクトリに送信することだけです。

誰も私が使用できるライナーはありますか?

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

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

サーバーにWebデプロイメントをセットアップするには、ポート、アクセス許可、およびいくつかのIISアドオンのインストールが必要ですか?

私は単純なものを実行するのが大好きです。

答えて

136

VS 2010の場合Azure SDK)では、Webプロジェクトのコマンドライン公開を簡略化しました。公開プロファイルを使用してこれを行いました。

Webプロジェクトの場合は、公開ダイアログを使用して公開プロファイルを作成できます。そのプロファイルを作成すると、プロジェクトのProperties \ PublishProfilesに自動的に保存されます。作成したプロファイルを使用して、コマンドラインから次のコマンドラインを使用して公開することができます。あなたには、いくつかの他の場所でのパブリッシュプロファイル(.pubxmlファイル)を保存したい場合は

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

あなたはPublishProfileへのパスを渡すことができます。

パブリッシュプロファイルはMSBuildファイルです。公開プロセスをカスタマイズする必要がある場合は、.pubxmlファイルの内部で直接行うことができます。

最終目標がコマンドラインからプロパティを渡すことです。次のことをお勧めします。 VSでサンプル公開プロファイルを作成します。発行プロファイルを調べて、コマンドラインで渡す必要のあるMSBuildプロパティを確認します。すべての公開メソッドがコマンドライン公開をサポートしているわけではありません(FTP/FPSEなど)。

FYIの代わりに.csproj/.vbprojをビルドしている場合。また、VS 2012を使用している場合は、/p:VisualStudioVersion=11.0も渡す必要があります。なぜ詳細についてはhttp://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspxを参照してください。上記のとおり、あなたが構築する必要がwebプロジェクトを

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

私は、OPが自分のローカルマシン上の任意のフォルダにWebアプリケーションを単に展開したいと思うと思います。 –

+9

その場合、ファイルシステム公開プロファイルを作成します。 –

+0

これは完璧です、このアップデートがスタンドアロンのmsbuild.exeに付属しているかどうか知っていますか? – Erik5388

9

ザッツは

Visual Studioを起動コマンドプロンプトを下回るようになりbuild.xmlファイルを作成します

実行のMSBuildのbuild.xml

VS 2012(だけでなく、公開の更新利用可能で
<?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> 
+6

この回答は非常に役に立ちましたが、改善のために追加することが1つあります。書かれたとおりに実行すると、robocopyは終了コード1を返して成功したコピーを示します... msbuildはビルドが失敗したと考えさせます。これを回避するには、robocopyコマンドで/ eの後に "if%errorlevel%leq 1 exit 0 else exit%errorlevel%"を追加するだけです。 – Alex

+0

上記の答えとアレックスのコメントはともに私にとって有益でした。の前にを追加して、プロジェクトフォルダをきれいに保ちます。 – JackArbiter

0

以下のコマンドは完璧に動作します。私たちは、 "公開"ではなくファイルコピーを使用します...

また、 DEBUG/RELEASEを使用してウェブサイトを構築します。実際の環境、つまり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> 

So;

  1. セットアップあなたの特性
  2. コールBuildPackage目標
  3. コールCopyOutput 出来上がりをターゲット!
+3

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

+1

このメソッドは、MVC Webサイトを公開するためには機能しません(ビューはコピーされません) – eka808

+0

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

0

を、しかし、あなたはまた、/コピーをパッケージ化する必要があります。

関連する問題