Как гарантировать, что ProjectReferece будет учитывать импортированные цели / реквизиты в ссылочном проекте

#msbuild

#msbuild

Вопрос:

У меня есть два проекта, A.csproj и B.csproj, где на B ссылается A по ProjectReference . И B импортирует общий файл целей/ реквизитов C. Общая цепочка ссылок выглядит следующим образом

A -(ProjectReference) -> B — (Импорт)-> C

Проблема в том, что:

Элементы / свойства, определенные в C, не видны целям, определенным в A.

Однако, если я изменю цепочку на A -(Импорт)-> B — (Импорт)-> C, эти элементы / свойства будут видны для целей, определенных в A.

Пожалуйста, обратите внимание, что это довольно распространенный сценарий, когда B устанавливает фундаментальный пакет nuget, содержащий дополнительные свойства / элементы, позже A зависит от B для достижения функциональности высокого уровня и не требует повторной установки пакета nuget.

EDIT1: добавьте пример структуры папок проекта A, B и пакета C следующим образом:

 <ROOT>--A--A.csproj
--------B--B.csproj
--------packages--C--build--C.props
----------------------------C.targets
---------------------lib--a.ini
--------------------------b.ini
 

A.csproj:

     <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!--
    <Import Project="..BB.csproj" />
    -->
    <ItemGroup>
    <ProjectReference Include="..BB.csproj">
    <Project>{20129E3E-FE37-4BEF-81A9-DA8F3AA7764B}</Project>
    <Name>B</Name>
    </ProjectReference>
    </ItemGroup>
    <Target Name="Build">
    <Message Text="in A, This is my list of MyPackageSourceFilesProperty: $(MyPackageSourceFilesProperty)"/>
    <Message Text="------" />
    <Message Text="in A, This is my list of BingoInB: %(BingoInB.FileName)"/>
    <Message Text="------" />
    <Message Text="in A, This is my list of MyPackageSourceFiles: %(MyPackageSourceFiles.FileName)"/>
    <Message Text="------" />
    <Message Text="in A, This is my list of ini files: %(Content.FileName)"/>
    </Target>
    </Project>
 

B.csproj:

     <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="..packagesCbuildC.props" Condition="Exists('..packagesCbuildC.props')" />
    <Target Name="Build">
    <Message Text="in B, This is my list of MyPackageSourceFilesProperty: $(MyPackageSourceFilesProperty)"/>
    <Message Text="------" />
    <Message Text="in B, This is my list of MyPackageSourceFiles: %(MyPackageSourceFiles.FileName)"/>
    <Message Text="------" />
    <Message Text="in B, This is my list of ini files: %(Content.FileName)"/>
    </Target>
    <Import Project="..packagesCbuildC.targets" Condition="Exists('..packagesCbuildC.targets')" />
    </Project>
 

C.целевые показатели:

     <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
    <MyPackageSourceFiles Include="$(MSBuildThisFileDirectory)..libnet45*.*" />
    <Content Include="@(MyPackageSourceFiles)">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    </ItemGroup>
    </Project>
 

C.реквизиты:

     <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
    <MyPackageSourceFilesProperty>$(MSBuildThisFileDirectory)..libnet45*.*</MyPackageSourceFilesProperty>
    </PropertyGroup>
    </Project>
 

Комментарии:

1. Пожалуйста, будьте немного более конкретны для вашего варианта использования, например, предоставьте воспроизводимый образец. Вы пытаетесь импортировать файлы, которые позже не будут copeid в вывод A? Ожидаете ли вы, что содержимое пакета NuGet будет транзитивным? используете ли вы новый csproj в стиле SDK (.NET Core / Standard) или классический csproj?

2. @MartinUllrich, цель состоит в том, чтобы скопировать файлы (в пакете C), скопированные на вывод A

3. Рассматривали ли вы использование NuGet contentFiles и PackageReference (вместо packages.config)? это дает вам переходное поведение. мне нужно будет рассмотреть это более подробно позже, но элементы должны оказаться в выходных данных, если вы ссылаетесь на проект и у него есть содержимое каталога copytooutputdirectory.