2013-04-26 77 views
66

我有一個使用VS2010創建的c#.Net 4.0項目,現在正在使用VS2012進行訪問。使用msbuild執行文件系統發佈配置文件

我試圖從本網站只發布所需的文件傳送到目標位置(C:\建立\ MyProject的[文件])

我的文件結構: ./ProjectRoot/MyProject .csproj的 ./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

我正在通過的MSBuild如下:

C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe ./ProjectRoot/MyProject.csproj/p:DeployOnBuild = true /p:PublishProfile=./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

下面是FileSystemDebug.pubxml的XML

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <WebPublishMethod>FileSystem</WebPublishMethod> 
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration> 
    <LastUsedPlatform>Any CPU</LastUsedPlatform> 
    <SiteUrlToLaunchAfterPublish /> 
    <ExcludeApp_Data>False</ExcludeApp_Data> 
    <publishUrl>C:\builds\MyProject\</publishUrl> 
    <DeleteExistingFiles>True</DeleteExistingFiles> 
    </PropertyGroup> 
</Project> 

產生的行爲是:

  • 一個zip文件在這裏創建:./ProjectRoot/obj/Debug/Package/MyProject.zip
  • 沒有被部署到<publishUrl>C:\builds\MyProject\</publishUrl> WTF
  • 創建的壓縮文件是豬早餐和全時不需要對應用程序文件。

當我運行此發佈配置文件通過Visual Studio的文件夾在* 的C創建:\建立\ MyProject的*幷包含我想確切的假象。

如何從msbuild得到這個簡單的結果?

回答

30

僅供參考:我與Visual Studio 2015有同樣的問題。嘗試幾個小時後,我現在可以做msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile

我不得不編輯我的.csproj文件才能使它工作。它包含了這樣一行:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
    Condition="false" /> 

我改變了這一行,如下所示:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" /> 

(我改變了10.0至14.0,不知道這是否是必要的,但我肯定有刪除的條件部分)

+1

爲了向後兼容,存在'Condition =「false」的條件導入。 VS2010要求此導入存在,即使由於虛假情況而被跳過。如果你再看一眼,那麼你會看到csproj包含另一個'$(VSToolsPath)\ WebApplications \ Microsoft.WebApplication.targets'的導入,它解析爲當前版本的Visual Studio的目標文件。 – 2016-03-04 08:54:12

+3

注意'$(MSBuildToolsVersion)'在正確的VS版本帳戶中的戰略使用:''。這對我VS2015更新1工作。 – 2016-03-17 03:53:46

35

找到答案在這裏: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

Visual Studio 2010中具有很大的新的Web應用程序項目發佈 功能,讓您輕鬆與 點擊一個按鈕,發佈您的Web應用程序項目。在幕後,Web.config轉換和 程序包構建是通過將大量MSBuild腳本導入 到您的項目文件(位於:C:網絡\ Microsoft.Web.Publishing.targets)。 不幸的是,腳本是非常複雜,凌亂和 沒有記錄(其他然後一些 - 拼寫錯誤,大多是無用的 評論在文件中)。該文件和一些 有關如何掛鉤的文檔的大流程圖會很好,但似乎是 可悲缺乏(或至少我找不到它)。

不幸的是,這意味着通過命令行 執行發佈比它需要的更加不透明。我感到驚訝的是在這方面文檔缺乏 ,因爲這些天很多商店使用持續集成服務器,有些甚至做自動化部署 (這VS2010發佈功能可以幫助很多),所以我想 會想到(這很容易!)將是一個 該功能的主要要求。

總之,通過Microsoft.Web.Publishing.targets挖 文件幾個小時,撞我的頭靠在試錯牆, 後我設法弄清楚Studio的視覺似乎履行 法寶之一單擊「發佈到文件系統」和「構建部署 包」功能。我將進入一點MSBuild腳本,所以如果你不熟悉MSBuild 我建議你看看這個崩潰 當然MSDN頁面。

發佈到文件系統

Visual Studio 2010的發佈到文件系統對話框發佈到文件系統了 了一段時間才能螺母,因爲我預計一些合理利用的MSBuild 的要發生。相反,VS2010的確有些奇怪:它在MSBuild上調用 來執行一種半部署,在你的項目的obj文件夾中準備了web 應用程序的文件,然後它似乎做了這些文件的手動 副本(即外部的MSBuild)到您的目標發佈 文件夾。這是真正的重擊行爲,因爲MSBuild被設計爲複製周圍(和其他構建相關的東西)文件,所以它會有意義 如果整個過程只是一個MS2010的目標VS2010叫做 上,而不是一個目標然後一個手動複製。

這意味着在命令行上通過MSBuild執行此操作並不像 那樣簡單,因爲它可以調用具有特定目標的項目文件,也可以通過設置某些屬性 。你需要做VS2010應該完成 :自己創建一個執行半部署的目標,然後 將結果複製到目標文件夾。編輯你的項目文件, 右擊VS2010中的項目並點擊Unload Project,然後 再次右擊並點擊Edit。向下滾動,直到找到導入網絡應用程序目標 (Microsoft.WebApplication.targets;該文件本身導入前面提到的 Microsoft.Web.Publishing.targets文件)的 導入元素。下面 這條線,我們將增加我們的新目標,稱爲PublishToFileSystem:

<Target Name="PublishToFileSystem" 
     DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder"> 
    <Error Condition="'$(PublishDestination)'==''" 
      Text="The PublishDestination property must be set to the intended publishing destination." /> 
    <MakeDir Condition="!Exists($(PublishDestination))" 
      Directories="$(PublishDestination)" /> 

    <ItemGroup> 
     <PublishFiles Include="$(_PackageTempDir)\**\*.*" /> 
    </ItemGroup> 

    <Copy SourceFiles="@(PublishFiles)" 
      DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')" 
      SkipUnchangedFiles="True" /> 
</Target> 

這個目標依賴於 PipelinePreDeployCopyAllFilesToOneFolder目標,這是它的手動複製什麼VS2010 調用之前。一些在 中挖掘Microsoft.Web.Publishing.targets顯示調用此目標導致 項目文件被放置到 屬性_PackageTempDir指定的目錄中。

我們在我們的目標中調用的第一個任務是Error任務,我們在其中設置了一個條件,確保只有在 PublishDestination屬性尚未設置時纔會發生任務。如果您忘記指定 PublishDestination屬性,這會捕獲您 並錯誤構建。然後我們調用MakeDir任務來創建 PublishDestination目錄,如果它尚不存在。

然後,我們定義一個名爲PublishFiles的項目,它表示在_PackageTempDir文件夾下找到的所有 文件。複製任務然後調用 將所有這些文件複製到發佈目標文件夾。 複製元素上的DestinationFiles屬性有點複雜; 它執行項目的變換並將它們的路徑轉換爲以PublishDestination文件夾爲根的新路徑 (查看知名的 項目元數據以查看這些%()的含義)。

要調用的命令行這一目標,我們現在可以簡單地執行 此命令(顯然改變了項目文件名和屬性 適合你):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem 
+3

我無法理解新目標的代碼片段(它顯示01 02 03 ...)。你能編輯嗎? – fan711 2013-10-09 16:56:28

+2

我同意fan711。雖然解決方案是在鏈接上描述的 - 那麼複製它是什麼? – 2013-12-11 09:51:55

+4

@АнтонКурьян:鏈接在一段時間後往往會死亡,這就是爲什麼stackoverflow.com上的問題和答案應該始終是獨立的,而不依賴於外部資源。 – Oliver 2014-09-29 20:51:12

11

它看起來對我來說,您的發佈配置文件未被使用,並執行一些默認打包。 Microsoft Web Publish目標完成上面所做的全部工作,它會根據配置選擇正確的目標。

我從我的TeamCity MSBuild工作沒有問題,但我確實指定了一個明確的路徑到配置文件,你只需要通過名稱調用它沒有.pubxml(例如FileSystemDebug)。只要在你的標準文件夾中就可以找到它。

例子:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug

注意這個使用Visual Studio 2012版本的Microsoft網絡的發佈目標,通常位於「C做:\程序文件(x86)\的MSBuild \微軟\ VisualStudio的\ 11.0 \ WEB」。查看用於特定部署類型目標的部署文件夾

+0

MS已經做了很多改進,因爲這是幾年前發佈的,感謝更新的編程? – 2016-01-28 16:43:02

13

嘗試所有上述答案(我使用Visual Studio 2013)後仍然有麻煩。沒有任何內容被複制到發佈文件夾。

美中不足的是,如果我有一個單獨的項目,而不是一個解決方案運行的MSBuild,我必須把它指定的Visual Studio版本的附加參數:

/p:VisualStudioVersion=12.0 

12.0是VS2013,與版本替換你用。一旦我添加了這個參數,它就工作了。

完整的命令行看起來是這樣的:

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0 

我發現在這裏:

http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

他們指出:

如果指定單個項目代替解決方案,您必須添加一個指定Visual Studio版本的參數ñ。

+0

這對我工作! – 2017-12-13 06:27:51

0

首先檢查可以發佈解決方案(項目)的開發人員PC的Visual Studio版本。 如圖所示是VS 2013

/p:VisualStudioVersion=12.0 

添加上述命令行指定什麼樣的一個Visual Studio版本應該構建項目。如前所述,當我們試圖發佈一個項目而不是整個解決方案時,可能會發生這種情況。

+0

對不起,shammakalubo你錯誤地解釋了這個問題。 – 2017-11-01 20:50:45

+0

@shammakalubo答案是對的,但它沒有完全說明。這個參數需要被添加到OP所提到的命令中,然後它會變成:'MSBuild C:\ PathToMyProject \ MyProject.csproj/p:DeployOnBuild = true/p:PublishProfile = MyPublishProfile/p:VisualStudioVersion = 12.0' This參數是我失蹤並解決了我的問題。你只需要完全提到答案! – 2017-12-13 06:29:49

相關問題