2010-12-14 66 views
0

我有兩個項目的解決方案。其中之一是一個簡單的項目,不依賴任何特殊的程序集來構建。但是,應用程序可以啓動一個外部可執行文件(我也擁有 - 這是我的解決方案的第二個項目)。當我構建項目時,我希望將外部項目的可執行文件(+依賴項,如app.config)複製到我的項目的目標目錄下。用MsBuild複製文件

我如何用MsBuild實現這個功能?我的第一個想法是添加對可執行文件的引用(即使我不需要它來構建)來複制文件。這對我來說似乎有點不好意思。

謝謝!

P.S.另一個問題:假設我可以告訴MsBuild複製可執行文件。如果可執行文件沒有編譯會怎麼樣?我可以強制它建立?

回答

3

你的情況,你應該讓你的MSBuild腳本替換你的解決方案,並宣佈有希望的依賴性:

<Project DefaultTargets="Executable_A"> 
    <Target Name="Executable_A" DependsOnTargets="Executable_B"> 
     <MSBuild Projects="Executable_A.proj" Targets="Build" /> 
    </Target> 

    <Target Name="Executable_B"> 
     <MSBuild Projects="Executable_B.proj" Targets="Build"> 
      <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" /> 
     </MSBuild> 
     <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="C:\My_Target_Path\" SkipUnchangedFiles="true" /> 
    </Target> 
</Project> 

...你可以指示你的第二個項目的目標將其輸出複製到所需位置。您甚至可以指示您的第一個項目將其輸出路徑存儲到要複製第二個項目(DestinationFolder)的輸出時使用的變量中。

+0

Eh Filburt,我剛剛嘗試了這個解決方案,這正是我所期待的!但是,不會複製Executable_B的app.config(和其他依賴項)。任何想法爲什麼? – Martin 2010-12-15 01:38:19

+0

@Martin呵呵......老實說,我得自己看看。 TargetOutputs只抓取項目本身實際構建的內容。你也可能想要省略SkipUnchangedFiles。只要找到正確的輸出參數,我就會更新我的答案。 – Filburt 2010-12-15 07:33:35

+0

我還沒有找到解決方案。任何想法? – Martin 2010-12-22 03:23:07

0

如果您對@Filburt回答滿意,我可以建議改進此解決方案。

如果默認構建目標是如何工作的,你會看一看:

<Target 
    Name="Build" 
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' " 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)" /> 

你會看到,從生成唯一的輸出或重建目標$(TARGETPATH)。 $(TargetPath)是構建程序集的完整路徑。要改變這種行爲,你可以破解構建過程。但是,這將是搭配簡單定義自己的目標項目

<Target 
    Name="BuildWithConfig" 
    DependsOnTargets="Clean;Build" 
    Returns="$(TargetPath);$(TargetPath).config" /> 

一個項目只是定義AfterBuild目標:

<Target Name="AfterBuild"> 
    <MSBuild Projects="Executable_B.proj" Targets="BuildWithConfig"> 
     <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" /> 
    </MSBuild> 
    <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="$(OutDir)\SubDirForB" SkipUnchangedFiles="true" /> 
</Target> 

此解決方案不要求對創建自定義構建腳本。你會直接在VS中得到結果。