#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.