Wie funktioniert ResolveProjectReferences Arbeit?
Möchte ich Profil und optimieren Sie unsere build-in der Hoffnung, um zu speichern einige Sekunden hier und dort. Ich war in der Lage, eine Aufgabe zu erstellen, ergibt sich aus ResolveAssemblyReferences und verwenden Sie es anstelle, aber ich habe Probleme beim Verständnis der folgenden (von Microsoft.Common.Ziele):
<!--
============================================================
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>
Einige Parameter übergeben werden und einige sind zurückgekehrt, aber wo ist die eigentliche Arbeit geschehen? Es gibt nicht viel, was auf der msdn - ich habe festgestellt, dass Microsoft ein.Bauen.Aufgaben.ResolveProjectBase, aber es ist nicht viel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ResolveProjectReferences (zumindest die, die Sie zeigen sind) ist ein Ziel, das verwendet, um inter-Projekt-Referenzen, indem Sie mit der <MSBuild> Aufgabe. Diese Aufgabe übernimmt ein Projekt-Datei erstellen, sowie die Namen von ein oder mehrere Ziele in dem Projekt, das aufgerufen werden soll, als Teil des build - (es nimmt auch andere Parameter, aber Sie können Sie ignorieren, diese für jetzt).
Betrachten Sie das folgende Ziel:
Wenn Sie referenziert ein Projekt mit diesem Ziel, und wollte zu beheben, die "Foo" target Ausgaben, würde ein <ProjectReference> - element in Ihrem Projekt wie folgt:
Beachten Sie, dass, wenn "Bauen" ist das Standard-Ziel für das Projekt verwiesen wird, könnten Sie lassen Sie die "Ziele" Metadaten vollständig ausschalten. Sie können auch angeben, mehrere Ziele in der Ziele-Metadaten (eine durch Semikolons getrennte Liste).
Damit Ihre ResolveProjectReferences Ziel kommen Sie vorbei und rufen Sie die <MSBuild - > task übergeben werden, "..\SomeProject\SomeProject.proj" und bittet, es zu bauen, die "Build" - Ziel. Jetzt, da das "Bauen" target spezifiziert Ausgänge über seine Returns-Attribut (aber die Ausgänge-Attribut wird verwendet, wenn in der Returns-Attribut nicht angegeben ist), diese Ergebnisse werden geerntet, während Sie das bauen, und kehrte in den <MSBuild - > Aufgaben der TargetOutputs parameter. Sie haben mehrere zusätzliche Stücke von Metadaten erweitert werden, die es ermöglichen, Sie zu trennen, Sie von Ursprung Ziel. Dazu gehören:
Wenn Sie arbeiten in einem C# - Projekt, gibt es eine Reihe von anderen Stadien der Auflösung von Referenzen (einschließlich Montage-Auflösung). Drop me a line, wenn Sie wollen wissen, über diese.