MSBuild(用于Delphi)类似于Make的功能

时间:2018-05-09 14:31:56

标签: delphi msbuild

我正在尝试为一组Delphi软件包设置依赖项,例如,如果应用程序A使用软件包1和软件包2,而应用程序B仅使用软件包1,那么只有在更改软件包2时才重建应用程序A. 目前,我正在使用组文件,并且每个包和应用程序都已构建(重新链接),即使它或其中一个依赖项未被更改。

更新:

Unit1.pas位于Package 1

Unit2.pas位于Package 2

Application A使用Package 1Package 2

Application B使用Package 2

我想要的是,如果我更改Unit1.pas,则 Package 1Application B会重建。 make会这样做,但我无法弄清楚如何使MSBUILD工作。

我的工作示例使用了一个组文件,这可能是潜在的问题。

1 个答案:

答案 0 :(得分:0)

好的,我想我已经解决了这个问题。 Groupprojs将永远重建/重新链接,因此这不是我想要的。

我已经创建了一个目标文件,因此它定义了4个项目以及每个项目的依赖项。它必须是所有依赖项,包括代码和二进制文件(即包)。

Msbuild有一个属性' DependsOnTarget'但是这并没有实现我想要的,所以我在代码和包上添加了依赖项。最终的build.targets文件看起来像这样......

<Project ToolsVersion="3.5" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
     DefaultTargets="Default">

<ItemGroup>
    <Package1 Include=".\Package1\Package1.dproj"/>
    <Package2 Include=".\Package2\Package2.dproj"/>
    <App6 Include=".\App6\Project6.dproj"/>
    <App7 Include=".\App7\Project7.dproj"/>
</ItemGroup>    

<ItemGroup>
    <Package1ExternalSourceFiles Include=".\Package1\*.pas" />
    <Package2ExternalSourceFiles Include=".\Package2\*.pas" />
    <App6ExternalSourceFiles Include=".\App6\*.pas" />
    <App7ExternalSourceFiles Include=".\App7\*.pas" />

    <Package1BinaryFiles Include=".\Package1\Win32\Release\Package1.bpl" />
    <Package2BinaryFiles Include=".\Package2\Win32\Release\Package2.bpl" />
    <App6BinaryFiles Include=".\App6\bin\Project6.exe" />
    <App7BinaryFiles Include=".\App7\bin\Project7.exe" />       
</ItemGroup>

<Target Name="App6" Inputs="@(App6ExternalSourceFiles);@(Package1BinaryFiles);@(Package2BinaryFiles)" Outputs="@(App6BinaryFiles)" DependsOnTargets="Package1;Package2">
<Message Text="App6" /> 
<MSBuild Projects="@(App6)"/>
</Target>

<Target Name="App7" Inputs="@(App7ExternalSourceFiles);@(Package1BinaryFiles)" Outputs="@(App7BinaryFiles)" DependsOnTargets="Package1">
<Message Text="App7" /> 
<MSBuild Projects="@(App7)"/>
</Target>

<Target Name="Package1" Inputs="@(Package1ExternalSourceFiles)" Outputs="@(Package1BinaryFiles)">
<Message Text="Package1" /> 
<MSBuild Projects="@(Package1)"/>
</Target>       

<Target Name="Package2" Inputs="@(Package2ExternalSourceFiles)" Outputs="@(Package2BinaryFiles)">
<Message Text="Package2" /> 
<MSBuild Projects="@(Package2)"/>
</Target>

<Target Name="Build">
    <CallTarget Targets="Package1;Package2;App6;App7"/>
</Target>
</Project>

这是否可扩展我不确定,我们可能会有大量项目和依赖项。

更新:实际上,如果它们与软件包分开发货,则不需要对应用程序的二进制依赖性。重新编译包1而不更改它的界面意味着不会重建App6和App7。