2012-12-08 114 views
18

我試圖在發佈事件後調用簡單的任務。當我說「發佈」時,我的意思是在Visual Studio中發佈,右鍵單擊項目並按「發佈...」。我已經包含(導入)目標文件在項目文件中正常工作,因爲我已經在Build事件上測試過它。 我發現在http://msdn.microsoft.com/en-us/library/ms366724.aspx有AfterPublish事件應該做我需要的,但它不。 我不確定這是否應該在Visual Studio中發佈時觸發的相同事件,有人請澄清此問題。 我的問題是如何從Visual Studio中的發佈目標文件觸發任何類型的任務?在Visual Studio中發佈事件後

我已經在目標文件試過這樣:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="AfterPublish"> 
     <Message Label="Test"></Message>   
     <Warning Label="Test"></Warning> 
    </Target> 
</Project> 

我使用Visual Studio 2010中

編輯:

我其實在尋找任何方式來執行上發佈的某些行動視覺工作室。我也在考慮添加Build Events,但我不知道如何確定它是否正在發佈。

編輯: @Alexey Shcherbak謝謝你的快速回復。 我在我的MSBuild輸出得到這個:

12/10/2012 12:29:40 AM:  Done executing task "CallTarget". 
12/10/2012 12:29:40 AM:  Done building target "PipelinePreDeployCopyAllFilesToOneFolder" in project "PublishTestApp.csproj". 
12/10/2012 12:29:40 AM:Done building project "PublishTestApp.csproj". 
Deleting existing files... 
Publishing folder /... 
Publishing folder Account... 
Publishing folder bin... 
Publishing folder Scripts... 
Publishing folder Styles... 
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== 
========== Publish: 1 succeeded, 0 failed, 0 skipped ========== 

所以我的任務將PipelinePreDeployCopyAllFilesToOneFolder後的權利,但這些文件的實際應對之前執行,我不考慮被公佈在這一點上沒有完成。 當然,我確實測試了這個,所以在MSBuild任務中,我正在執行簡單的讀取文本文件,假設要複製到發佈文件夾中,並且失敗。

+0

在回覆您的編輯時增加了另一部分 –

回答

14

發佈上下文菜單未運行「發佈」目標(如果我們正在談論發佈網站,不發佈ClickOnce包)。

如果您使用VS2010 - 上下文菜單將運行「PipelinePreDeployCopyAllFilesToOneFolder」目標,並且在VS2012中(如果要切換,請記住這一點),它將運行「MSDeployPublish」目標。我想你應該閱讀this question and answer。 Jez和我提供了關於如何鉤住Before \發佈目標之後的非常全面的答案。

總之 - 對MSBuild的版本> = 4.0,你可以使用這種方法

<Target Name="Mytarget" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder" > 
    <Message Label="Test"></Message>   
    <Warning Label="Test"></Warning> 
</Target> 

@ EDIT1:使用CopyAllFilesToSingleFolderForPackage,而不是PipelinePreDeployCopyAllFilesToOneFolder - 文件應這個目標之後被複制。 如果您只需要在VS上下文中啓動目標時觸發目標 - 請檢查我發佈的鏈接並添加更多條件 - 檢查此類Visual Studio啓動如下Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" 如果您添加更多上下文,比如您想要什麼類型的目標發佈後發佈等。 - 它可以加入更多內容,並幫助別人理解

+0

請參閱有關更新的問題,謝謝。 –

+0

這是我正在尋找的'Target'(如果有一篇博客文章描述所有MSBuild目標,我會感謝任何人分享它)。我的問題是我希望轉換文件僅在發佈時切換,而不是在創建時切換。 –

+0

@RobScott AFAIK沒有這種東西--MSBuild的設計方式意味着你的目標及其版本(和覆蓋)對於你的機器來說是非常獨特的,並且取決於你有什麼SDKs \項目類型\版本的msbuild和VS安裝。它根據您的環境動態編寫構建腳本。這是非常強大的,但在同一時間非常脆弱。所以它不能有任何全面的目標列表。你可以學習如何閱讀詳細的日誌以及如何自己讀取.targets文件,這樣你就可以找到你需要的東西,但是沒有作弊表格( –

4

我只是寫我如何在Visual Studio 2013在這裏實現了這個帖子的問題:http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to-the-next-level/

從本質上講,這是一個神奇的:

<Target Name="Mytarget" AfterTargets="MSDeployPublish" > 
    <Message Text="The name of the publish profile is $(DestinationAppRoot)"/> 
    .... Here's where you do something awesome... 
</Target> 

我鼓勵您閱讀整篇文章以獲取更多信息。

+1

是否還有像$(DestinationAppRoot)這樣的變量可以到達目標URL? –

+0

老實說,我不知道,嘗試搜索整個硬盤的'DestinationAppRoot'和你可能會偶然發現一些有用的東西,我真的不記得我是如何使用這裏發佈的解決方案的。:) –

0

我對另一個問題的回答可能有些用處。

AfterPublish script doesn't run when I publish a web app

特別是在使用的路徑,「發佈文件」,你可以在一個參數通過$(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder)通過。這將是類似於c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp

+0

因此,也許這應該被評爲重複,而不是呢? –

+0

我不知道它是否'完全重複'...只是認爲我的另一個答案的信息可能有助於讓他在哪裏。如果您認爲需要,會讓您舉報。謝謝。 – Terry

+0

我不是這裏的專家。如果這個帖子不是重複的,請定製你對這個問題的回答,那麼即使內部鏈接可以消失,然後未來的訪問者也會被一個'see here'鏈接指向無處。 –

1

我嘗試了其他所有答案,但他們只是沒有工作。就我而言,我發佈一個VSTO加載項以使用VS2015,所以也許有事情不同的東西,但在這裏是做了工作的兩個選項:原因

<Target Name="AfterPublish"> 
    <Warning Text="publish warning 1" /> 
</Target> 
<Target Name="CustomTarget" AfterTargets="AfterPublish"> 
    <Warning Text="publish warning 2" /> 
</Target> 

第一部分(和assumedly其他)很難與這是Message任務似乎沒有做任何事情。我期待Output視圖中的文字,但沒有出現。 Error List中沒有Message項,但是通過使用Warning來代替,它們確實出現在Error List中。不幸的是,我對MSBuild不夠了解,爲什麼Message不符合預期。

+1

我在VS.NET 2017 RC4和AfterTargets =「AfterPublish」中嘗試了這些工作。謝謝。 – dstr

相關問題