Asp.net

如何獲得 Visual Studio 的“發布”功能以包含來自建構後事件的文件?

  • June 29, 2010

我目前正在嘗試使用 Visual Studio 2010 的“發布”和 MSDeploy 功能來處理我的 Web 部署需求,但在根據我的建構配置自定義包方面遇到了障礙。

我在 32 位環境中開發,但需要為 64 位環境創建發布包,因此在“發布”配置中,我有一個建構後事件,將第三方 dll 的 64 位版本複製到 bin 目錄中,覆蓋 32 位版本. 當我使用“發布”功能時,即使將正確的 64 位 dll 複製到 bin 目錄,它也不會包含在包中。

有沒有辦法讓“發布”包含在建構後事件期間複製到 bin 目錄中的文件?

我在How do you include additional files using VS2010 web deployment packages中回答了一個類似但不同的問題?.

在您使用建構後事件的場景中,我建議您刪除建構後事件並使用您自己的 MSBuild 目標而不是建構後事件來實施您的操作。您將在下面找到另一個答案的文本。


來自:如何使用 VS2010 Web 部署包包含附加文件?


好問題。我剛剛在Web 部署工具 (MSDeploy) 上發布了一個非常詳細的部落格條目:包含額外文件或排除特定文件的建構包

這是概要。在包含文件之後,我還將展示如何排除文件。

包括額外文件

在包中包含額外的文件有點困難,但如果您對 MSBuild 感到滿意,那麼仍然沒有什麼大不了的,如果您不熟悉,請閱讀本文。為了做到這一點,我們需要掛鉤收集用於打包的文件的過程部分。我們需要擴展的目標稱為CopyAllFilesToSingleFolder. 這個目標有一個依賴屬性,PipelinePreDeployCopyAllFilesToOneFolderDependsOn我們可以利用它並註入我們自己的目標。因此,我們將創建一個名為的目標並將CustomCollectFiles其註入到程序中。我們通過以下方式實現這一點(請記住在 import 語句之後)。

<PropertyGroup>
 <CopyAllFilesToSingleFolderForPackageDependsOn>
   CustomCollectFiles;
   $(CopyAllFilesToSingleFolderForPackageDependsOn);
 </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

這會將我們的目標添加到流程中,現在我們需要定義目標本身。假設您有一個名為 Extra Files 的文件夾,它位於您的 Web 項目上方 1 級。您想要包含所有這些文件。這是CustomCollectFiles目標,我們之後再討論。

<Target Name="CustomCollectFiles">
 <ItemGroup>
   <_CustomFiles Include="..\Extra Files\**\*" />

   <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
     <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
   </FilesForPackagingFromProject>
 </ItemGroup>
</Target>

我在這裡所做的是創建項目_CustomFiles,並在 Include 屬性中告訴它拾取該文件夾中的所有文件以及它下面的任何文件夾。然後我使用這個項目來填充FilesForPackagingFromProject項目。這是 MSDeploy 實際用於添加額外文件的項目。另請注意,我聲明了元數據DestinationRelativePath值。這將確定它將被放置在包中的相對路徑。我在這裡使用了額外的聲明Files%(RecursiveDir)%(Filename)%(Extension)。這就是說將它放在包中與 Extra Files 文件夾下相同的相對位置。

排除文件

如果您打開使用 VS 2010 創建的 Web 應用程序的項目文件,您會在其底部找到一行。

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

順便說一句,您可以在 VS 中打開項目文件。右鍵點擊項目選擇解除安裝項目。然後右鍵點擊解除安裝的項目並選擇編輯項目。

該聲明將包括我們需要的所有目標和任務。如果您不確定是否在之後進行,我們的大多數定制都應該在該導入之後!因此,如果您有要排除的文件,ExcludeFromPackageFiles則可以使用項目名稱 , 來執行此操作。例如,假設您有一個名為 Sample.Debug.js 的文件,該文件包含在您的 Web 應用程序中,但您希望將該文件從創建的包中排除。您可以將下面的程式碼段放在該導入語句之後。

<ItemGroup>
 <ExcludeFromPackageFiles Include="Sample.Debug.xml">
   <FromTarget>Project</FromTarget>
 </ExcludeFromPackageFiles>
</ItemGroup>

通過聲明填充此項,文件將被自動排除。請注意FromTarget此處元數據的使用。我不會在這裡討論,但您應該知道始終指定這一點。

引用自:https://stackoverflow.com/questions/3137880