MSBuild - Je možné sdílet definované položky v podřízené projektu svému mateřskému bez použití import?

hlasů
0

Otázka

Jak mohu získat předměty definované v podřízené projektu s jeho rodiči bez použití <Import>prvku? Důvod, proč chci, aby se zabránilo <Import>je, protože to také dováží cílů, které vykonávají na nadřazeného projektu, což není žádoucí.

Příklad

Řekněme, že máte následující child.csproj:

<Project Sdk=Microsoft.NET.Sdk>
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <MyItem Include=some.file />
    </ItemGroup>

    <Target Name=MyChildPreBuild BeforeTargets=Build>
        <Message Text=MyChildPreBuild Importance=high />
        <Message Text=%(MyItem.FullPath) Importance=high />
    </Target>
</Project>

A to se odkazuje parent.csproj:

<Project Sdk=Microsoft.NET.Sdk>
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <MyItem Include=some.other.file />
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include=..\child\child.csproj />
    </ItemGroup>

    <Target Name=MyPreBuild BeforeTargets=Build>
        <Message Text=MyPreBuild Importance=high />
        <Message Text=%(MyItem.FullPath) Importance=high />
    </Target>
</Project>

Building parent.csproj, mám následující sestavení výstupní zprávu:

1>------ Rebuild All started: Project: child, Configuration: Debug Any CPU ------
1>child -> C:\Users\dan\test\child\bin\Debug\netstandard2.0\child.dll
2>------ Rebuild All started: Project: parent, Configuration: Debug Any CPU ------
2>parent -> C:\Users\dan\test\parent\bin\Debug\netstandard2.0\parent.dll
2>C:\Users\dan\test\parent\some.other.file
========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========

Jak lze vidět, tak jsou parent.csproj MyItempoložky jsou vytištěny.

Přidávání <Import Project=..\child\child.csproj />se parent.csprojtiskne všechny MyItems, ale cílová dítěte se provádí stejně:

1>------ Rebuild All started: Project: child, Configuration: Debug Any CPU ------
1>child -> C:\Users\dan\test\child\bin\Debug\netstandard2.0\child.dll
1>MyChildPreBuild
1>C:\Users\dan\test\child\some.file
2>------ Rebuild All started: Project: parent, Configuration: Debug Any CPU ------
2>C:\Users\dan\test\child\child.csproj : warning MSB4011: C:\Program Files\dotnet\sdk\2.1.403\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.props cannot be imported again. It was already imported at C:\Users\dan\test\parent\parent.csproj. This is most likely a build authoring error. This subsequent import will be ignored.
2>C:\Users\dan\test\parent\parent.csproj : warning MSB4011: C:\Program Files\dotnet\sdk\2.1.403\Sdks\Microsoft.NET.Sdk\Sdk\Sdk.targets cannot be imported again. It was already imported at C:\Users\dan\test\child\child.csproj. This is most likely a build authoring error. This subsequent import will be ignored.
2>parent -> C:\Users\dan\test\parent\bin\Debug\netstandard2.0\parent.dll
2>MyChildPreBuild
2>C:\Users\dan\test\parent\some.other.file
2>C:\Users\dan\test\parent\some.file
2>MyPreBuild
2>C:\Users\dan\test\parent\some.other.file
2>C:\Users\dan\test\parent\some.file
========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========
Položena 07/11/2018 v 23:32
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Pokud použijete importmetodu můžete přidat podmínku do podřízených cílů, které mají vykonat pouze tehdy, když je tento příznak není nastaven. Pak se ve vaší mateřské společnosti, nastavit příznak na hodnotu.

Dítě

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <MyItem Include="some.file" />
    </ItemGroup>

    <Target Name="MyChildPreBuild" BeforeTargets="Build" Condition="'$(ParentProject}'==''">
        <Message Text="MyChildPreBuild" Importance="high" />
        <Message Text="%(MyItem.FullPath)" Importance="high" />
    </Target>
</Project>

A pak, v nadřazeného projektu

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <ParentProject>parent.csproj</ParentProject>
    </PropertyGroup>

    <ItemGroup>
        <MyItem Include="some.other.file" />
    </ItemGroup>

    <Import Project="..\child\child.csproj" />

    <Target Name="MyPreBuild" BeforeTargets="Build">
        <Message Text="MyPreBuild" Importance="high" />
        <Message Text="%(MyItem.FullPath)" Importance="high" />
    </Target>
</Project>

To by mělo zabránit tomu, aby dítě cílů z volána při importu.

Odpovězeno 08/11/2018 v 01:28
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more