Как ResolveProjectReferences работает?

Я хочу профилировать и настраивать нашу сборку, надеясь сэкономить несколько секунд здесь и там. Мне удалось создать задачу, производную от ResolveAssemblyReferences, и использовать ее вместо этого, но у меня возникли проблемы с пониманием следующего (от Microsoft.Общий.цели):

<!--
    ============================================================
                                        ResolveProjectReferences

    Build referenced projects:

        [IN]
        @(NonVCProjectReference) - The list of non-VC project references.

        [OUT]
        @(_ResolvedProjectReferencePaths) - Paths to referenced projects.
    ============================================================
    -->
    <Target
        Name="ResolveProjectReferences"
        DependsOnTargets="SplitProjectReferencesByType;_SplitProjectReferencesByFileExistence">

        <!--
        When building this project from the IDE or when building a .SLN from the command-line,
        just gather the referenced build outputs.  The code that builds the .SLN will already have
        built the project, so there's no need to do it again here.

        The ContinueOnError setting is here so that, during project load, as
        much information as possible will be passed to the compilers.
        -->
        <MSBuild
            Projects="@(_MSBuildProjectReferenceExistent)"
            Targets="GetTargetPath"
            BuildInParallel="$(BuildInParallel)"
            UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)"
            Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
            Condition="'@(NonVCProjectReference)'!='' and ('$(BuildingSolutionFile)' == 'true' or '$(BuildingInsideVisualStudio)' == 'true' or '$(BuildProjectReferences)' != 'true') and '@(_MSBuildProjectReferenceExistent)' != ''"
            ContinueOnError="!$(BuildingProject)">

            <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths"/>
        </MSBuild>

        <!--
        Build referenced projects when building from the command line.

        The $(ProjectReferenceBuildTargets) will normally be blank so that the project's default
        target is used during a P2P reference. However if a custom build process requires that
        the referenced project has a different target to build it can be specified.
        -->
        <MSBuild
            Projects="@(_MSBuildProjectReferenceExistent)"
            Targets="$(ProjectReferenceBuildTargets)"
            BuildInParallel="$(BuildInParallel)"
            UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)"
            Condition="'@(NonVCProjectReference)'!='' and '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildingSolutionFile)' != 'true' and '$(BuildProjectReferences)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != ''">
            <Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths"/>

        </MSBuild>

        <!--
        Get manifest items from the (non-exe) built project references (to feed them into ResolveNativeReference).
        -->
        <MSBuild
            Projects="@(_MSBuildProjectReferenceExistent)"
            Targets="GetNativeManifest"
            BuildInParallel="$(BuildInParallel)"
            UnloadProjectsOnCompletion="$(UnloadProjectsOnCompletion)"
            Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
            Condition="'@(NonVCProjectReference)'!='' and '$(BuildingProject)'=='true' and '@(_MSBuildProjectReferenceExistent)'!=''">

            <Output TaskParameter="TargetOutputs" ItemName="NativeReference"/>

        </MSBuild>


        <!-- Issue a warning for each non-existent project. -->
        <Warning
            Text="The referenced project '%(_MSBuildProjectReferenceNonexistent.Identity)' does not exist."
            Condition="'@(NonVCProjectReference)'!='' and '@(_MSBuildProjectReferenceNonexistent)'!=''"/>
    </Target>

некоторые параметры передаются, а некоторые возвращаются, но где происходит фактическая работа? На msdn не так много - я нашел Microsoft.Строить.Задачи.ResolveProjectBase, но это не так много использовать.

1 ответов


ResolveProjectReferences (по крайней мере, тот, на который вы указываете)-это цель, которая используется для разрешения ссылок между проектами, создавая их с помощью задач. Эта задача требует создания файла проекта, а также имен одной или нескольких целей в проекте, которые должны вызываться как часть сборки (она также принимает другие параметры, но вы можете игнорировать их сейчас).

рассмотрим следующую цель:

<Target
  Name="Build"
  Returns="@(BuildOutput)">

  <ItemGroup>
    <BuildOutput Include="bin\Debug\Foo.exe" />
  </ItemGroup>
</Target>

Если вы ссылаетесь проект, содержащий эту цель, и хотел бы разрешить выходы цели" Foo", у вас был бы элемент в вашем проекте, например:

<ItemGroup>
  <ProjectReference Include="..\SomeProject\SomeProject.proj">
    <Targets>Build</Targets>
  </ProjectReference>
</ItemGroup>

обратите внимание, что если "Build" является целью по умолчанию для указанного проекта, вы можете полностью оставить метаданные "Targets". Можно также указать несколько целевых объектов в метаданных целевых объектов (список с разделителями-точками с запятой).

таким образом, ваша цель ResolveProjectReferences появится и вызовет задачу . У них есть несколько дополнительных фрагментов метаданных, которые позволяют разделить их по исходной цели. Эти включить:

  • MSBuildSourceProjectFile-ссылочный проект, сборка которого сгенерировала вывод
  • MSBuildSourceTargetName-имя цели, построение которой сгенерировало вывод

Если вы работаете внутри проекта c#, есть куча других этапов разрешения ссылок (включая разрешение сборки). Напишите Мне, если хотите узнать об этом.