2012-12-17 70 views
67

我正在尋找一個命令來運行MSBuild.exe,它只需要一個MVC 4項目並將其發佈到給定目錄。使用MSBuild.exe使用cmd行「發佈」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 2012(以及發佈可用的更新在VS 2010的Azure SDK中),我們簡化了Web項目的命令行發佈。我們通過使用「發佈配置文件」來完成此操作

在VS中,您可以使用發佈對話框創建發佈配置文件。當您創建該配置文件時,它將自動存儲在Properties \ PublishProfiles下的項目中。您可以使用創建的配置文件通過命令行從命令行發佈以下內容。

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

如果你想存儲在其他位置發佈配置(.pubxml文件),你可以在路徑PublishProfile通過。

發佈配置文件是MSBuild文件。如果您需要自定義發佈過程,則可以直接在.pubxml文件中進行。

如果您的最終目標是從命令行傳遞屬性。我會建議以下。在VS中創建示例發佈配置文件。檢查該發佈配置文件以確定需要在命令行上傳遞哪些MSBuild屬性。僅供參考,並非所有發佈方法都支持命令行發佈(即FTP/FPSE)。

僅供參考如果您正在構建.csproj/.vbproj而不是。SLN,你使用VS 2012,你也應該通過/p:VisualStudioVersion=11.0。有關詳細信息,請參閱http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx。下面

+2

我認爲OP只是想將web應用程序「部署」到本地機器上的任意文件夾。 –

+9

在這種情況下,請創建一個文件系統發佈配置文件。 –

+0

這是完美的,你知道這個更新是否帶有獨立的msbuild.exe? – Erik5388

9

創建一個build.xml文件多數民衆贊成看起來像下面

啓動Visual Studio命令提示符

運行的MSBuild的build.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> 
+6

這個答案對我來說很有幫助,但是我會添加一件事來改善它。如果以書面形式執行它,robocopy將返回退出代碼1以指示成功複製...導致msbuild認爲構建失敗。要解決這個問題,只需在robocopy命令中的/ e後附加「if%errorlevel%leq 1 exit 0 else exit%errorlevel%」。 – Alex

+0

上述答案和Alex的評論都對我有幫助。我還會在之前添加以保持項目文件夾清潔。 – JackArbiter

0

命令可以完美運行:

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

當你只是想發佈的內容文件,這個工程。但不執行web.config轉換 – andreas

+1

此方法不適用於發佈MVC網站(視圖不會被複制) – eka808

+0

對於Web API等Web應用程序,不會在bin文件夾中生成兩個關鍵文件:App_global.asax。 DLL和App_global.asax.compiled。我推薦使用上面的Sayed的例子。 –

0

不同,需要建立,按照上面的web項目,但你還需要打包/複製。我們使用文件副本,而不是「發佈」...

另外;我們使用DEBUG/RELEASE來構建網站;但然後實際環境,即「QA」或「PROD」來處理web.config轉換。

所以我們先用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目標 瞧!