soneta / Soneta.MsBuild.SDK

Sdk stworzone przez firmę Soneta pozwalające automatycznie skonfigurować oraz uzupełnić projekty dodatków o niezbędne elementy potrzebne do współpracy z oprogramowaniem enova.
MIT License
8 stars 12 forks source link

Obsługa wielu plików business.xml #15

Closed swiato closed 5 years ago

swiato commented 5 years ago

Poprawka issue #13

Poniżej przedstawiam uproszczony przykład, jak mniej więcej to działa:

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

  <ItemGroup>
    <GroupOne Include="A" />
    <GroupOne Include="B" />
    <GroupOne Include="C" />
    <GroupTwo Include="@(GroupOne)" />
  </ItemGroup>

  <Target Name="Exec" Outputs="%(GroupOne.Identity)">

    <ItemGroup>
      <AllWithoutCurrentElement Include="@(GroupTwo)" Exclude="%(GroupOne.Identity)"/>
    </ItemGroup>

    <Message Text="@(AllWithoutCurrentElement) Building @(GroupOne->'%(Identity)')" Importance="High"/>
  </Target>

</Project>

Output:

Exec:
  B;C Building A
Exec:
  A;C Building B
Exec:
  A;B Building C
swiato commented 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.

swiato commented 5 years ago

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.

bartcho commented 5 years ago

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