簡體   English   中英

使用 msbuild 執行文件系統發布配置文件

[英]Using msbuild to execute a File System Publish Profile

我有使用 VS2010 創建的 ac# .Net 4.0 項目,現在可以使用 VS2012 訪問。

我正在嘗試僅將需要的文件從該網站發布到目標位置(C:\\builds\\MyProject[Files])

我的文件結構: ./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 沒有部署任何內容
  • 創建的 zip 文件是一個豬早餐,里面充滿了應用程序不需要的文件。

當我通過 Visual Studio 運行此發布配置文件時,會在 * C:\\builds\\MyProject*處創建一個文件夾,其中包含我想要的確切工件。

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

僅供參考:我在 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,不確定是否有必要。但我肯定必須刪除條件部分。)

在這里找到答案: 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:\\Program Files (x86)\\MSBuild\\Microsoft\\VisualStudio\\v10.0\\Web\\Microsoft .Web.Publishing.targets)。 不幸的是,該腳本非常復雜、凌亂且未記錄(除了文件中一些經常拼寫錯誤且大部分無用的注釋)。 該文件的大流程圖和一些關於如何掛鈎的文檔會很好,但似乎缺少(或者至少我找不到)。

不幸的是,這意味着通過命令行執行發布比它需要的更加不透明。 我對這方面缺乏文檔感到驚訝,因為如今許多商店使用持續集成服務器,有些甚至進行自動化部署(VS2010 發布功能可以提供很多幫助),所以我本以為啟用此功能(很容易!)將是該功能的一個相當主要的要求。

無論如何,在挖掘 Microsoft.Web.Publishing.targets 文件數小時並將我的頭撞在試錯牆上之后,我設法弄清楚 Visual Studio 似乎如何執行其神奇的一鍵“發布到文件系統”和“構建部署包”功能。 我將介紹一些 MSBuild 腳本,因此如果您不熟悉 MSBuild,我建議您查看此速成課程 MSDN 頁面。

發布到文件系統

VS2010 Publish To File System Dialog Publish to File System 花了我一段時間才搞明白,因為我預計會出現一些對 MSBuild 的明智使用。 相反,VS2010 做了一些非常奇怪的事情:它調用 MSBuild 執行一種半部署,在項目的 obj 文件夾中准備 Web 應用程序的文件,然后它似乎手動復制這些文件(即在 MSBuild 之外)進入您的目標發布文件夾。 這確實是一種打擊行為,因為 MSBuild 旨在復制文件(以及其他與構建相關的內容),因此,如果整個過程只是 VS2010 調用的一個 MSBuild 目標,而不是目標然后手動復制,那將是有意義的。

這意味着在命令行上通過 MSBuild 執行此操作並不像使用特定目標調用項目文件並設置某些屬性那么簡單。 您需要做 VS2010 應該做的事情:自己創建一個執行半部署的目標,然后將結果復制到目標文件夾。 要編輯您的項目文件,請在 VS2010 中右鍵單擊該項目並單擊“卸載項目”,然后再次右鍵單擊並單擊“編輯”。 向下滾動,直到找到導入 Web 應用程序目標的 Import 元素(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 文件夾下找到的所有文件。 然后調用復制任務,將所有這些文件復制到發布目標文件夾。 Copy 元素上的 DestinationFiles 屬性有點復雜; 它執行項目的轉換並將它們的路徑轉換為以 PublishDestination 文件夾為根的新路徑(查看 Well-Known Item Metadata 以了解那些 %()s 的含義)。

要從命令行調用此目標,我們現在只需執行此命令(顯然更改項目文件名和屬性以適合您):

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

嘗試上述所有答案后仍然遇到問題(我使用 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 版本的參數。

在我看來,您的發布配置文件沒有被使用,並且正在執行一些默認打包。 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

請注意,這是使用 Microsoft Web Publish 目標的 Visual Studio 2012 版本完成的,通常位於“C:\\Program Files (x86)\\MSBuild\\Microsoft\\VisualStudio\\v11.0\\Web”。 查看所使用的特定部署類型目標的部署文件夾

僅供參考:在構建服務器上運行也有同樣的問題(安裝了 msbuild 15 的 Jenkins,由 VS 2017 在 .NET Core 2.1 Web 項目上驅動)。

在我的情況下,是使用“發布”目標與 msbuild 忽略了配置文件。

所以我的 msbuild 命令開始於:

msbuild /t:restore;build;publish

這正確地觸發了發布過程,但沒有組合或變體“/p:PublishProfile=FolderProfile”曾經用於選擇我想要使用的配置文件(“FolderProfile”)。

當我停止使用發布目標時:

msbuild /t:restore;build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile

我(愚蠢地)認為這沒什么區別,但是一旦我使用了 DeployOnBuild 開關,它就正確地獲取了配置文件。

實際上,我將您所有的答案合並到我自己的解決方案中如何解決上述問題:

  1. 我根據需要創建了 pubxml 文件
  2. 然后我將 pubxml 文件中的所有參數復制到我自己的 msbuild.exe 參數列表“/p:foo=bar”
  3. 我扔掉了 pubxml 文件

結果是這樣的:

msbuild /t:restore /t:build /p:WebPublishMethod=FileSystem /p:publishUrl=C:\\builds\\MyProject\\ /p:DeleteExistingFiles=True /p:LastUsedPlatform="Any CPU" /p:Configuration=Release

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

 /p:VisualStudioVersion=12.0

添加上述命令行以指定應構建項目的 Visual Studio 版本類型。 正如之前的答案,當我們嘗試僅發布一個項目而不是整個解決方案時,可能會發生這種情況。

所以完整的代碼應該是這樣的

"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\msbuild.exe" "C:\\Program Files (x86)\\Jenkins\\workspace\\Jenkinssecondsample\\MVCSampleJenkins\\MVCSampleJenkins.csproj" /T:Build;Package /p :Configuration=DEBUG /p:OutputPath="obj\\DEBUG" /p:DeployIisAppPath="默認網站/jenkinsdemoapp" /p:VisualStudioVersion=12.0

從項目文件夾運行

msbuild /p:DeployOnBuild=true /p:PublishProfile="release-file.pubxml" /p:AspnetMergePath="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v10.0A\\bin\\NETFX 4.8 Tools"/ p:配置=發布

這負責 web.config Transform 和 AspnetMergePath

使用網站項目而不是網絡項目是否已經遇到過這個問題? 我有 ASP.Net C# 網站項目,但無法使用 msbuild 命令讀取發布配置。 我一直試圖找到一個星期的解決方案,但沒有運氣。 如果您在網站 prj 上遇到過這個問題,有人可以告訴我嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM