Closed swiato closed 5 years ago
Po dokładniejszym przeanalizowaniu targeta ExecuteSonetaGenerator jednak uważam, że nie ma sensu go rozbijać osobno dla business.xml i config.xml. Aby działało to poprawnie, wystarczy wprowadzić drobną poprawkę. Polega ona na tym, aby tworząc każdy z plików cs, wyłączyć z dołączanych plików business.xml te, których nazwa bez rozszerzenia jest taka sama jak generowanego pliku. Realizuje to poniższy fragment:
<SameAssemblyBusinessXmls Include="@(BusinessXmls)" Exclude="@(WorkingXmls->'%(Identity)'->Replace('.config.xml','.business.xml'))"/>
Poniżej zamieszczam bardzo uproszczony przykład, ilustrujący jak działa ten target:
/// input
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<BusinessXmls Include="A.business.xml" />
<BusinessXmls Include="B.business.xml" />
<BusinessXmls Include="C.business.xml" />
</ItemGroup>
<ItemGroup>
<ConfigXmls Include="A.config.xml" />
<ConfigXmls Include="B.config.xml" />
<ConfigXmls Include="C.config.xml" />
</ItemGroup>
<ItemGroup>
<WorkingXmls Include="@(BusinessXmls)"/>
<WorkingXmls Include="@(ConfigXmls)"/>
</ItemGroup>
<Target Name="Exec" Outputs="%(WorkingXmls.Identity)">
<ItemGroup>
<SameAssemblyBusinessXmls Include="@(BusinessXmls)" Exclude="@(WorkingXmls->'%(Identity)'->Replace('.config.xml','.business.xml'))"/>
</ItemGroup>
<Message Text="@(SameAssemblyBusinessXmls) -> Building: @(WorkingXmls->'%(Identity)')" Importance="High"/>
</Target>
</Project>
/// output:
Exec:
B.business.xml;C.business.xml -> Building: A.business.xml
Exec:
A.business.xml;C.business.xml -> Building: B.business.xml
Exec:
A.business.xml;B.business.xml -> Building: C.business.xml
Exec:
B.business.xml;C.business.xml -> Building: A.config.xml
Exec:
A.business.xml;C.business.xml -> Building: B.config.xml
Exec:
A.business.xml;B.business.xml -> Building: C.config.xml
Moim zdaniem, jest OK.
Pozostał jeszcze jeden problem, którego nie udało mi się rozwiązać. Po poprawkach w naszym Sdk, po zbudowaniu dodatku SonetaSupport, okazało się, że w wygenerowanym pliku *.config.cs brakuje usinga do Soneta.Config. Nie udało mi się znaleźć przyczyny, także nie wiem, czy to problem po stronie Sdk czy generatora.
Wpis z generatora z MakeConfig
if (module.Usings!=null)
foreach (string name in module.Usings)
cs.Write("using {0};", name);
cs.Write("using {0};", module.Namespace);
a nasze business.xml zaczynają się od:
<using>Soneta.Config</using>
W support.git tego wpisu nie ma, więc wszystko wydaje się jasne
Poprawka issue #13
Poniżej przedstawiam uproszczony przykład, jak mniej więcej to działa:
Output: