代码之家  ›  专栏  ›  技术社区  ›  mmmm

MSBuild(用于Delphi)Make-like功能

  •  0
  • mmmm  · 技术社区  · 6 年前

    我正在尝试为一组Delphi包设置依赖项,例如,如果应用程序a使用包1和包2,而应用程序B仅使用包1,则在更改包2时仅重建应用程序a。 目前,我使用的是一个组文件,每个包和应用程序都被构建(重新链接),即使它或它的一个依赖项没有更改。

    更新时间:

    Unit1.pas 在中 Package 1

    Unit2.pas 在中 Package 2

    Application A 使用 包1 包2

    Application B 使用 包2

    我想要的是如果我改变 第一单元。pas公司 然后 只有 包1 应用程序B 已重建。 make 可以这样做,但我无法确定MSBUILD如何工作。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   mmmm    6 年前

    好的,我想我已经解决了。Groupprojs将始终重建/重新链接,因此这不是我想要的。

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

    Msbuild有一个属性“DependsOnTarget”,但这并没有达到我想要的效果,所以我在代码和包上都添加了依赖项。最终构建。目标文件如下所示。。。

    <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。