MSBuild (для Delphi) Make-like функциональность - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь установить зависимости для набора пакетов Delphi, например, если Приложение A использует Пакет 1 и Пакет 2, а Приложение B использует только Пакет 1, тогда только Приложение А перестраивается при изменении Пакета 2.В настоящее время я использую групповой файл, и каждый пакет и приложение создается (повторно связывается), даже если он или одна из его зависимостей не изменены.

ОБНОВЛЕНИЕ:

Unit1.pas в Package 1

Unit2.pas в Package 2

Application A использует Package 1 и Package 2

Application B использовать Package 2

Я хочу, чтобы, если я изменил Unit1.pas, то ONLY Package 1 и Application B были перестроены.make сделает это, но я не могу понять, как можно заставить работать MSBUILD.

В моем работающем примере используется групповой файл, который может быть основной проблемой.

1 Ответ

0 голосов
/ 16 мая 2018

ОК, думаю, я разобрался с этим.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 не будут перестроены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...