2012-04-18 50 views
8

是否可以爲以下文件的輸出指定不同的文件夾?我可以指定MSBuild <Content>標籤的輸出路徑嗎?

<Content Include="test.stl"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 
+0

你發現了怎麼做? – 2012-08-29 07:25:41

+0

還沒有,對不起。 – abenci 2012-08-29 09:07:13

+1

此鏈接不顯示如何指定一個不同的文件夾與內容標籤,但它看起來像一個解決方法,可能允許你做你想做的事情... http://stackoverflow.com/questions/7643615/how-can- i-get-msbuild-to-copy-all-files-marked-as-content-to-a-folder-preservin – 2012-08-31 20:15:54

回答

5

你可以,但不能與'內容'。這取決於項目任務,但是大部分內置的項目任務都可以入侵,因此值得付出麻煩或副作用。

有一個基本的磨損路徑來處理這:)這也避免了令人討厭的PostBuild cmd shell的方式,如果你在做.Net,並使用真正的構建過程。

我沒有看到任何其他類似的答案,使用strought up MSBuild,我認爲OPs問題的核心是。這是核心概念,也是最短路徑,它禁止找到具有「相對於輸出路徑」路徑參數且無副作用的項目類型。

1)後期處理方式:

<ItemGroup> 
    ... 
    <MyTargets Include="test.stl"/> 
    ... 
</ItemGroup> 
底部

然後(使用你是什麼路徑後):

<PropertyGroup> 
    <MyDeployDir>$(SolutionDir)$(Configuration)</MyDeployDir> 
    <MyOtherDeployDir>$(SolutionDir)$(Configuration)\Templates</MyDeployDir> 
</PropertGroup> 

然後你現有 MS構建包括(不加這個,在這裏作爲標記):

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 

然後「後建設」:

<Target Name="AfterBuild"> 
    <Copy SourceFiles="@(MyTargets)" DestinationFolder="$(MyDeployDir)" SkipUnchangedFiles="true" /> 
    <Copy SourceFiles="@(MyOtherTargets)" DestinationFolder="$(MyOtherDeployDir)" SkipUnchangedFiles="true" /> 
    <Copy SourceFiles="@(MyTargets2)" DestinationFolder="$(MyDeployDir)\IHeardYourMomLikesGrapeNuts" SkipUnchangedFiles="true" /> 
</Target> 

的fundemental問題是項目的項目不做默認情況下任何東西,他們有一個像類型的「內容」或「MyTarget」。它的那些類型說明會發生什麼。你可能能夠找到一個任務,或者類型,或者構建腳本包含了你想要的東西,但是對於項目組中的一個項目來說沒有什麼內在的東西,只要在構建期間該文件會發生什麼。以上是專門建立的「任務」的權力之間的平衡,但沒有任何麻煩。

一旦你添加

<ItemGroup> 
    <MyOutFiles Include="xxx.xxx" /> 

一次到項目文件,它就會出現在任何文件中,在那裏你可以在任何文件中設置,而無需手動編輯PROJ文件BuildAction的列表。


2)在一個步驟

在更高版本的MSBuild可以嵌入「的ItemGroup」的「AfterBuild」目標內,做了以上或做其他花哨的東西不碰文件的其餘部分。這例如允許使用簡單的包含獲取構建的結果並將其置於其他地方。這一切都沒有做RoboCopy任何東西或採用更復雜的構建目標函數處理。

<Target Name="AfterBuild"> 
    <ItemGroup> 
    <MyOutFiles Include="$(OutDir)*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyOutFiles)" DestinationFolder="$(SolutionDir)\Application" SkipUnchangedFiles="true" /> 

編輯(由於下投票?,海報評論自刪除):

爲了消除可能的方法,並重申,此方法不使用MSBuild的'函數'或替代任務,如'RoboCopy',但其目的是顯示更純粹的MSBuild風格使用核心功能人們可以用來製作項目任務,如「內容」本身。

問題是我可以指定'以下文件的不同文件夾',我可以爲內容標籤執行此操作嗎?您可以使用MSBuild函數重新路由所有BuildAction,但是我不認爲這是問題。

你可以做到這一點,如上所示,所以我不認爲這是更復雜,更容易閱讀。下面是簡短的表格,並讓他創建自己的BuildAction,無論如何他都可以進行處理。所以不,你不能告訴'內容'爲標記爲'內容'的特定文件選擇另一個文件夾,但是你可以製作另一個相當容易的構建動作。您也可以將元信息注入到StlFiles標記中,該標記指示您可以將其設置在標記本身上的操作,或者像內容那樣在流程的早期掛鉤StlFiles,但這更加複雜。

<StlFiles Include="test.stl" />   
... 
<Target Name="AfterBuild"> 
    <Copy SourceFiles="@(StlFiles)" DestinationFolder="$(SolutionDir)\Release\MyTypes" SkipUnchangedFiles="true" /> 
+0

答案沒有錯,它的工作原理。提供的鏈接顯示了使用腳本函數的另一種方式,我特別避免了這種方法,例如避免RoboCopy任務。所提供的鏈接將所有內容投射到一個地方,這是一個文件。他要求提供一個文件。問題是:項目任務是否可以使用備用輸出路徑。答案是肯定的,不是,'內容'不能,但其他任務可以,但這是一種可以控制的方法。 – Celess 2012-09-04 17:34:24

+0

我的第一條評論上面有一條評論,顯然已被刪除;只是說...所以上面並不是隨機的。這是我回復的反對票評論,以及爲什麼編輯部分存在於答案中。現在缺少的評論措辭相當強硬,「因爲不僅這個答案是錯誤的,而且使得簡單的事情比它需要的複雜得多」,所以「落選投票」的效果「由BitwiseMan。 – Celess 2012-09-07 01:58:06

+0

他引用的鏈接是:http://stackoverflow.com/questions/7643615/how-can-i-get-msbuild-to-copy-all-files-marked-as-content-to-a-folder-preservin – Celess 2012-09-07 02:05:08

0

沒有辦法額外指定輸出文件夾AFAIK,但可以在構建之前或之後複製文件。

0

此功能未內置到內容項目中。但是你可以通過向你的項目文件添加一個目標來實現它。

在你的項目,你現在有這樣的:

<ItemGroup> 
    <Content Include="test.stl"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

假設你想要的複製到其他位置的一個特定的文件,將其添加到終點(結束前「項目」標籤):

<Target Name="CopyStl" AfterTargets="AfterBuild"> 
    <!-- One or the other of these Copy tasks should do what you want --> 
    <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" /> 
    <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" /> 
</Target> 

如果你想添加一些文件複製到同一文件夾,試試這個來代替:

<Target Name="CopySomeFiles" AfterTargets="AfterBuild"> 
    <!-- One or the other of these Copy tasks should do what you want --> 
    <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" /> 
    <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" /> 
</Target 
0

不同的輸出文件夾,可以通過使用Link元數據中指定的None/Content項目:

<Content Include="test.stl"> 
    <Link>some\folder\%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

當使用include語句通配符,這也是保留目錄層次結構的方式,甚至從未來的文件項目目錄之外:使用2.0.0+ SDK

<Content Include="..\shared\**\*"> 
    <Link>some\folder\%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

在基於SDK的項目(默認的ASP.NET核心/ .NET核心/ .NET標準項目),同樣可以使用LinkBase實現元數據:

<Content Include="..\shared\**\*" LinkBase="some\folder" CopyToOutputDirectory="PreserveNewest" /> 
相關問題