2013-10-28 223 views
12

有一個winforms(NET 3.5)項目foo.csproj具有本地化的資源文件。我使用msbuild來構建項目並創建部署結構。配置msbuild輸出路徑

<MSBuild Projects="foo.csproj" Properties="Configuration=Release;OutputPath=..\deploy\foo" Targets="Build" /> 

它複製foo.exe的所有本地化dll的部署\ foo的文件夾,但我需要本地化的dll被複制到單獨的文件夾,它應該是:

  • 部署\富\富。 EXE
  • 部署\ \語言環境RU-RU \ foo.resources.dll
  • 部署\ \區域設置PT-BR \ foo.resources.dll

有什麼辦法來CONFI gure msbuild複製EXE和DLL到不同的文件夾?

+0

如果您談論resx文件,應在GenerateSatelliteAssemblies和CopyFilesToOutputDirectory期間生成並複製文件名對應的子文件夾。你是如何命名你的資源文件的? – JoeBilly

+0

是的,我的意思是resx文件。我將Res.resx,Res.ru-RU.resx等文件添加到項目中,msbuild在輸出文件夾中創建這些子文件夾 - 與創建foo.exe文件的位置相同。但我需要將這些子文件夾複製到單獨的位置 - deploy \ locales – wince

回答

3

資源文件的生成和複製是在構建過程中在內部MSBuild進程中完成的:GenerateSatelliteAssembliesCopyFilesToOutputDirectory。它們被複制到輸出目錄中。

據我所知,你不能修改這種行爲。

您必須在構建步驟後移動資源文件。我建議使用MSBuild community tasksMove任務。

<MSBuild Projects="foo.csproj" Properties="Configuration=Release;OutputPath=..\deploy\foo" Targets="Build" /> 

<CreateItem Include="..\deploy\foo\**\*.resources.dll"> 
    <Output TaskParameter="Include" ItemName="ResourcesToMove" /> 
</CreateItem> 

<Move SourceFiles="@(ResourcesToMove)" DestinationFiles="@(ResourcesToMove->'..\deploy\locales\%(RecursiveDir)\%(Filename)%(Extension)')"/> 
+0

謝謝,我想這是一個解決方案。我現在將嘗試執行msbuild社區任務。 – wince

+0

這個答案對你來說可能有點矯枉過正。考慮先嚐試傑羅姆的回答,可能會節省一些時間。 –

18

使用MSBuild命令行可以指定輸出路徑,如下所示;

 

C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe /t:Build /p:OutDir=c:\custom_build_out\;Configuration=PRODUCTION;Platform=x64 
 

注:

  1. 如果更改指定爲OUTDIR/P財產的順序,這是行不通的。
  2. OutDir屬性用於指定備用dirctory的完整路徑。 OutputPath用於相對目錄。
  3. 它的一個項目名稱+構建配置名稱在自定義生成輸出路徑中,因爲msbuild不會將這些內容附加到OutDir。
+0

謝謝,這對我很有用! –

+0

這很完美!我必須改變順序,就是這樣,暢通無阻!^_^ –

+0

這不適用於ToolsVersion =「14.0」的我,MSBuild無法找到引用。我用PowerShell手動複製。 –