是否可以爲以下文件的輸出指定不同的文件夾?我可以指定MSBuild <Content>標籤的輸出路徑嗎?
<Content Include="test.stl">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
是否可以爲以下文件的輸出指定不同的文件夾?我可以指定MSBuild <Content>標籤的輸出路徑嗎?
<Content Include="test.stl">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
你可以,但不能與'內容'。這取決於項目任務,但是大部分內置的項目任務都可以入侵,因此值得付出麻煩或副作用。
有一個基本的磨損路徑來處理這:)這也避免了令人討厭的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" />
答案沒有錯,它的工作原理。提供的鏈接顯示了使用腳本函數的另一種方式,我特別避免了這種方法,例如避免RoboCopy任務。所提供的鏈接將所有內容投射到一個地方,這是一個文件。他要求提供一個文件。問題是:項目任務是否可以使用備用輸出路徑。答案是肯定的,不是,'內容'不能,但其他任務可以,但這是一種可以控制的方法。 – Celess 2012-09-04 17:34:24
我的第一條評論上面有一條評論,顯然已被刪除;只是說...所以上面並不是隨機的。這是我回復的反對票評論,以及爲什麼編輯部分存在於答案中。現在缺少的評論措辭相當強硬,「因爲不僅這個答案是錯誤的,而且使得簡單的事情比它需要的複雜得多」,所以「落選投票」的效果「由BitwiseMan。 – Celess 2012-09-07 01:58:06
他引用的鏈接是: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
沒有辦法額外指定輸出文件夾AFAIK,但可以在構建之前或之後複製文件。
此功能未內置到內容項目中。但是你可以通過向你的項目文件添加一個目標來實現它。
在你的項目,你現在有這樣的:
<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
不同的輸出文件夾,可以通過使用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" />
你發現了怎麼做? – 2012-08-29 07:25:41
還沒有,對不起。 – abenci 2012-08-29 09:07:13
此鏈接不顯示如何指定一個不同的文件夾與內容標籤,但它看起來像一個解決方法,可能允許你做你想做的事情... 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