diff --git a/src/Build.UnitTests/BackEnd/Scheduler_Tests.cs b/src/Build.UnitTests/BackEnd/Scheduler_Tests.cs index dc86010e269..80a98eb8112 100644 --- a/src/Build.UnitTests/BackEnd/Scheduler_Tests.cs +++ b/src/Build.UnitTests/BackEnd/Scheduler_Tests.cs @@ -10,6 +10,8 @@ using Microsoft.Build.Shared; using Microsoft.Build.Execution; using Microsoft.Build.Evaluation; +using Microsoft.Build.Experimental.ProjectCache; +using Shouldly; using TaskItem = Microsoft.Build.Execution.ProjectItemInstance.TaskItem; using Xunit; @@ -520,6 +522,31 @@ public void TestTraversalAffinityIsInProc() Assert.Equal(request1, response[0].BuildRequest); } + /// + /// Make sure that traversal projects are marked with an affinity of "InProc", which means that + /// even if multiple are available, we should still only have the single inproc node. + /// + [Fact] + public void TestProxyAffinityIsInProc() + { + _host.BuildParameters.MaxNodeCount = 4; + ReportDefaultParentRequestIsFinished(); + + CreateConfiguration(1, "foo.csproj"); + + BuildRequest request1 = CreateProxyBuildRequest(1, 1, new ProxyTargets(new Dictionary {{"foo", "bar"}}), null); + + BuildRequestBlocker blocker = new BuildRequestBlocker(-1, new string[] { }, new[] { request1 }); + List response = new List(_scheduler.ReportRequestBlocked(1, blocker)); + + // There will be no request to create a new node, because both of the above requests are proxy build requests, + // which have an affinity of "inproc", and the inproc node already exists. + Assert.Single(response); + Assert.Equal(ScheduleActionType.ScheduleWithConfiguration, response[0].Action); + Assert.Equal(request1, response[0].BuildRequest); + Assert.Equal(Scheduler.InProcNodeId, response[0].NodeId); + } + /// /// With something approximating the BuildManager's build loop, make sure that we don't end up /// trying to create more nodes than we can actually support. @@ -729,8 +756,10 @@ private BuildRequest CreateBuildRequest(int nodeRequestId, int configId, string[ /// /// Creates a build request. /// - private BuildRequest CreateBuildRequest(int nodeRequestId, int configId, string[] targets, NodeAffinity nodeAffinity, BuildRequest parentRequest) + private BuildRequest CreateBuildRequest(int nodeRequestId, int configId, string[] targets, NodeAffinity nodeAffinity, BuildRequest parentRequest, ProxyTargets proxyTargets = null) { + (targets == null ^ proxyTargets == null).ShouldBeTrue(); + HostServices hostServices = null; if (nodeAffinity != NodeAffinity.Any) @@ -739,8 +768,36 @@ private BuildRequest CreateBuildRequest(int nodeRequestId, int configId, string[ hostServices.SetNodeAffinity(String.Empty, nodeAffinity); } - BuildRequest request = new BuildRequest(1 /* submissionId */, nodeRequestId, configId, targets, hostServices, BuildEventContext.Invalid, parentRequest); - return request; + if (targets != null) + { + return new BuildRequest( + submissionId: 1, + nodeRequestId, + configId, + targets, + hostServices, + BuildEventContext.Invalid, + parentRequest); + } + + parentRequest.ShouldBeNull(); + return new BuildRequest( + submissionId: 1, + nodeRequestId, + configId, + proxyTargets, + hostServices); + } + + private BuildRequest CreateProxyBuildRequest(int nodeRequestId, int configId, ProxyTargets proxyTargets, BuildRequest parentRequest) + { + return CreateBuildRequest( + nodeRequestId, + configId, + null, + NodeAffinity.Any, + parentRequest, + proxyTargets); } /// @@ -778,5 +835,11 @@ private void MockPerformSchedulingActions(IEnumerable response MockPerformSchedulingActions(moreResponses, ref nodeId, ref inProcNodeExists); } } + + private void ReportDefaultParentRequestIsFinished() + { + var buildResult = new BuildResult(_defaultParentRequest); + _scheduler.ReportResult(_defaultParentRequest.NodeRequestId, buildResult); + } } } diff --git a/src/Build.UnitTests/ProjectCache/ProjectCacheTests.cs b/src/Build.UnitTests/ProjectCache/ProjectCacheTests.cs index 8ccde2767a9..ec460ade72b 100644 --- a/src/Build.UnitTests/ProjectCache/ProjectCacheTests.cs +++ b/src/Build.UnitTests/ProjectCache/ProjectCacheTests.cs @@ -398,6 +398,15 @@ public void ProjectCacheByBuildParametersAndGraphBuildWorks(GraphCacheResponse t var graphResult = buildSession.BuildGraph(graph); + if (buildParameters.DisableInProcNode + && testData.NonCacheMissResults.Any(c => c.Value.ProxyTargets is not null)) + { + // TODO: remove this branch when the DisableInProcNode failure is fixed by https://github.com/dotnet/msbuild/pull/6400 + graphResult.OverallResult.ShouldBe(BuildResultCode.Failure); + buildSession.Logger.Errors.First().Code.ShouldBe("MSB4223"); + return; + } + graphResult.OverallResult.ShouldBe(BuildResultCode.Success); buildSession.Dispose(); @@ -425,6 +434,17 @@ public void ProjectCacheByBuildParametersAndBottomUpBuildWorks(GraphCacheRespons foreach (var node in graph.ProjectNodesTopologicallySorted) { var buildResult = buildSession.BuildProjectFile(node.ProjectInstance.FullPath); + + if (buildParameters.DisableInProcNode && + testData.NonCacheMissResults.TryGetValue(GetProjectNumber(node), out var cacheResult) && + cacheResult.ProxyTargets is not null) + { + // TODO: remove this branch when the DisableInProcNode failure is fixed by https://github.com/dotnet/msbuild/pull/6400 + buildResult.OverallResult.ShouldBe(BuildResultCode.Failure); + buildSession.Logger.Errors.First().Code.ShouldBe("MSB4223"); + return; + } + buildResult.OverallResult.ShouldBe(BuildResultCode.Success); nodesToBuildResults[node] = buildResult; @@ -484,6 +504,65 @@ public void ProjectCacheByVSWorkaroundWorks(GraphCacheResponse testData, BuildPa } } + [Theory] + [InlineData(true)] + [InlineData(false)] + public void RunningProxyBuildsOnOutOfProcNodesShouldIssueWarning(bool disableInprocNodeViaEnvironmentVariable) + { + var testData = new GraphCacheResponse( + new Dictionary + { + {1, new[] {2}} + }, + new Dictionary + { + {1, GraphCacheResponse.SuccessfulProxyTargetResult()}, + {2, GraphCacheResponse.SuccessfulProxyTargetResult()} + }); + + var graph = testData.CreateGraph(_env); + var mockCache = new InstanceMockCache(testData); + + var buildParameters = new BuildParameters + { + MaxNodeCount = Environment.ProcessorCount, + ProjectCacheDescriptor = ProjectCacheDescriptor.FromInstance( + mockCache, + null, + graph) + }; + + if (disableInprocNodeViaEnvironmentVariable) + { + _env.SetEnvironmentVariable("MSBUILDNOINPROCNODE", "1"); + } + else + { + buildParameters.DisableInProcNode = true; + } + + using var buildSession = new Helpers.BuildManagerSession(_env, buildParameters); + + var graphResult = buildSession.BuildGraph(graph); + + if (!disableInprocNodeViaEnvironmentVariable) + { + // TODO: remove this branch when the DisableInProcNode failure is fixed by https://github.com/dotnet/msbuild/pull/6400 + graphResult.OverallResult.ShouldBe(BuildResultCode.Failure); + buildSession.Logger.Errors.First().Code.ShouldBe("MSB4223"); + return; + } + + graphResult.OverallResult.ShouldBe(BuildResultCode.Success); + + buildSession.Dispose(); + + buildSession.Logger.FullLog.ShouldContain("Static graph based"); + + buildSession.Logger.AssertMessageCount("MSB4274", 1); + + } + private void AssertCacheBuild( ProjectGraph graph, GraphCacheResponse testData, diff --git a/src/Build/BackEnd/Components/Logging/LoggingContext.cs b/src/Build/BackEnd/Components/Logging/LoggingContext.cs index 6194726d5f4..5fd43fbbfb7 100644 --- a/src/Build/BackEnd/Components/Logging/LoggingContext.cs +++ b/src/Build/BackEnd/Components/Logging/LoggingContext.cs @@ -213,6 +213,12 @@ internal void LogFatalError(Exception exception, BuildEventFileInfo file, string _hasLoggedErrors = true; } + internal void LogWarning(string messageResourceName, params object[] messageArgs) + { + ErrorUtilities.VerifyThrow(_isValid, "must be valid"); + _loggingService.LogWarning(_eventContext, null, BuildEventFileInfo.Empty, messageResourceName, messageArgs); + } + /// /// Log a warning /// diff --git a/src/Build/BackEnd/Components/Scheduler/SchedulableRequest.cs b/src/Build/BackEnd/Components/Scheduler/SchedulableRequest.cs index 9305abe7c66..994f3b155e9 100644 --- a/src/Build/BackEnd/Components/Scheduler/SchedulableRequest.cs +++ b/src/Build/BackEnd/Components/Scheduler/SchedulableRequest.cs @@ -463,6 +463,8 @@ public void VerifyOneOfStates(SchedulableRequestState[] requiredStates) ErrorUtilities.ThrowInternalError("State {0} is not one of the expected states.", _state); } + public bool IsProxyBuildRequest() => BuildRequest.IsProxyBuildRequest(); + /// /// Change to the specified state. Update internal counters. /// diff --git a/src/Build/BackEnd/Components/Scheduler/Scheduler.cs b/src/Build/BackEnd/Components/Scheduler/Scheduler.cs index 1e335cedb85..03fc8f8a1ab 100644 --- a/src/Build/BackEnd/Components/Scheduler/Scheduler.cs +++ b/src/Build/BackEnd/Components/Scheduler/Scheduler.cs @@ -11,6 +11,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Build.Execution; +using Microsoft.Build.Experimental.ProjectCache; using Microsoft.Build.Framework; using Microsoft.Build.Shared; @@ -166,6 +167,10 @@ internal class Scheduler : IScheduler /// private AssignUnscheduledRequestsDelegate _customRequestSchedulingAlgorithm; + private NodeLoggingContext _inprocNodeContext; + + private int _loggedWarningsForProxyBuildsOnOutOfProcNodes = 0; + /// /// Constructor. /// @@ -610,6 +615,7 @@ public void InitializeComponent(IBuildComponentHost host) _componentHost = host; _resultsCache = (IResultsCache)_componentHost.GetComponent(BuildComponentType.ResultsCache); _configCache = (IConfigCache)_componentHost.GetComponent(BuildComponentType.ConfigCache); + _inprocNodeContext = new NodeLoggingContext(_componentHost.LoggingService, InProcNodeId, true); } /// @@ -791,6 +797,9 @@ private void AssignUnscheduledRequestsToNodes(List responses, { // We want to find more work first, and we assign traversals to the in-proc node first, if possible. AssignUnscheduledRequestsByTraversalsFirst(responses, idleNodes); + + AssignUnscheduledProxyBuildRequestsToInProcNode(responses, idleNodes); + if (idleNodes.Count == 0) { return; @@ -972,6 +981,27 @@ private void AssignUnscheduledRequestsByTraversalsFirst(List r } } + /// + /// Proxy build requests should be really cheap (only return properties and items) and it's not worth + /// paying the IPC cost and re-evaluating them on out of proc nodes (they are guaranteed to be evaluated in the Scheduler process). + /// + private void AssignUnscheduledProxyBuildRequestsToInProcNode(List responses, HashSet idleNodes) + { + if (idleNodes.Contains(InProcNodeId)) + { + List unscheduledRequests = new List(_schedulingData.UnscheduledRequestsWhichCanBeScheduled); + foreach (SchedulableRequest request in unscheduledRequests) + { + if (CanScheduleRequestToNode(request, InProcNodeId) && request.IsProxyBuildRequest()) + { + AssignUnscheduledRequestToNode(request, InProcNodeId, responses); + idleNodes.Remove(InProcNodeId); + break; + } + } + } + } + /// /// Returns true if the request is for a traversal project. Traversals are used to find more work. /// @@ -1348,7 +1378,27 @@ private void AssignUnscheduledRequestToNode(SchedulableRequest request, int node responses.Add(ScheduleResponse.CreateScheduleResponse(nodeId, request.BuildRequest, mustSendConfigurationToNode)); TraceScheduler("Executing request {0} on node {1} with parent {2}", request.BuildRequest.GlobalRequestId, nodeId, (request.Parent == null) ? -1 : request.Parent.BuildRequest.GlobalRequestId); + + WarnWhenProxyBuildsGetScheduledOnOutOfProcNode(); + request.ResumeExecution(nodeId); + + void WarnWhenProxyBuildsGetScheduledOnOutOfProcNode() + { + if (request.IsProxyBuildRequest() && nodeId != InProcNodeId) + { + ErrorUtilities.VerifyThrow( + _componentHost.BuildParameters.DisableInProcNode || _forceAffinityOutOfProc, + "Proxy requests should only get scheduled to out of proc nodes when the inproc node is disabled"); + + var loggedWarnings = Interlocked.CompareExchange(ref _loggedWarningsForProxyBuildsOnOutOfProcNodes, 1, 0); + + if (loggedWarnings == 0) + { + _inprocNodeContext.LogWarning("ProxyRequestNotScheduledOnInprocNode"); + } + } + } } /// @@ -2057,6 +2107,11 @@ private NodeAffinity GetNodeAffinityForRequest(BuildRequest request) return NodeAffinity.InProc; } + if (request.IsProxyBuildRequest()) + { + return NodeAffinity.InProc; + } + BuildRequestConfiguration configuration = _configCache[request.ConfigurationId]; // The affinity may have been specified by the host services. diff --git a/src/Build/BackEnd/Shared/BuildRequest.cs b/src/Build/BackEnd/Shared/BuildRequest.cs index 4a0a4efb7f1..2bde7843447 100644 --- a/src/Build/BackEnd/Shared/BuildRequest.cs +++ b/src/Build/BackEnd/Shared/BuildRequest.cs @@ -419,5 +419,10 @@ internal static INodePacket FactoryForDeserialization(ITranslator translator) } #endregion + + public bool IsProxyBuildRequest() + { + return ProxyTargets != null; + } } } diff --git a/src/Build/Resources/Strings.resx b/src/Build/Resources/Strings.resx index 9bce56de852..2441874fb8f 100644 --- a/src/Build/Resources/Strings.resx +++ b/src/Build/Resources/Strings.resx @@ -1894,4 +1894,7 @@ Utilization: {0} Average Utilization: {1:###.0} Killing process with pid = {0}. + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + diff --git a/src/Build/Resources/xlf/Strings.cs.xlf b/src/Build/Resources/xlf/Strings.cs.xlf index f223fa5d580..fd441c3a8d6 100644 --- a/src/Build/Resources/xlf/Strings.cs.xlf +++ b/src/Build/Resources/xlf/Strings.cs.xlf @@ -257,6 +257,11 @@ Počáteční hodnota vlastnosti: $({0})={1} Zdroj: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: Projekt {0} přeskočil omezení izolace grafu v odkazovaném projektu {1}. diff --git a/src/Build/Resources/xlf/Strings.de.xlf b/src/Build/Resources/xlf/Strings.de.xlf index 14323a1cb89..e55f606d0d3 100644 --- a/src/Build/Resources/xlf/Strings.de.xlf +++ b/src/Build/Resources/xlf/Strings.de.xlf @@ -257,6 +257,11 @@ Anfangswert der Eigenschaft: $({0})="{1}", Quelle: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: Das Projekt "{0}" hat Graphisolationseinschränkungen für das referenzierte Projekt "{1}" übersprungen. diff --git a/src/Build/Resources/xlf/Strings.en.xlf b/src/Build/Resources/xlf/Strings.en.xlf index 035b1fdf1cb..2e20e50527d 100644 --- a/src/Build/Resources/xlf/Strings.en.xlf +++ b/src/Build/Resources/xlf/Strings.en.xlf @@ -257,6 +257,11 @@ Property initial value: $({0})="{1}" Source: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" diff --git a/src/Build/Resources/xlf/Strings.es.xlf b/src/Build/Resources/xlf/Strings.es.xlf index 3ada5cb3c4a..1b26dadc718 100644 --- a/src/Build/Resources/xlf/Strings.es.xlf +++ b/src/Build/Resources/xlf/Strings.es.xlf @@ -257,6 +257,11 @@ Valor inicial de la propiedad: $({0})="{1}" Origen: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: El proyecto "{0}" ha omitido las restricciones de aislamiento de gráficos en el proyecto "{1}" al que se hace referencia. diff --git a/src/Build/Resources/xlf/Strings.fr.xlf b/src/Build/Resources/xlf/Strings.fr.xlf index 90105ef4478..cdcca79f380 100644 --- a/src/Build/Resources/xlf/Strings.fr.xlf +++ b/src/Build/Resources/xlf/Strings.fr.xlf @@ -257,6 +257,11 @@ Valeur initiale de la propriété : $({0})="{1}" Source : {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: le projet "{0}" a ignoré les contraintes d'isolement de graphe dans le projet référencé "{1}" diff --git a/src/Build/Resources/xlf/Strings.it.xlf b/src/Build/Resources/xlf/Strings.it.xlf index 6711613ae06..bcd50a9ef47 100644 --- a/src/Build/Resources/xlf/Strings.it.xlf +++ b/src/Build/Resources/xlf/Strings.it.xlf @@ -257,6 +257,11 @@ Valore iniziale della proprietà: $({0})="{1}". Origine: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: il progetto "{0}" ha ignorato i vincoli di isolamento del grafico nel progetto di riferimento "{1}" diff --git a/src/Build/Resources/xlf/Strings.ja.xlf b/src/Build/Resources/xlf/Strings.ja.xlf index aa758e3a206..e1a88799392 100644 --- a/src/Build/Resources/xlf/Strings.ja.xlf +++ b/src/Build/Resources/xlf/Strings.ja.xlf @@ -257,6 +257,11 @@ プロパティの初期値: $({0})="{1}" ソース: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: プロジェクト "{0}" は、参照先のプロジェクト "{1}" で、グラフの分離制約をスキップしました diff --git a/src/Build/Resources/xlf/Strings.ko.xlf b/src/Build/Resources/xlf/Strings.ko.xlf index af1e71f0f9a..75af46eda13 100644 --- a/src/Build/Resources/xlf/Strings.ko.xlf +++ b/src/Build/Resources/xlf/Strings.ko.xlf @@ -257,6 +257,11 @@ 속성 초기 값: $({0})="{1}" 소스: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: 프로젝트 "{0}"에서 참조된 프로젝트 "{1}"의 그래프 격리 제약 조건을 건너뛰었습니다. diff --git a/src/Build/Resources/xlf/Strings.pl.xlf b/src/Build/Resources/xlf/Strings.pl.xlf index 791c924d51e..6ea85ee644b 100644 --- a/src/Build/Resources/xlf/Strings.pl.xlf +++ b/src/Build/Resources/xlf/Strings.pl.xlf @@ -257,6 +257,11 @@ Wartość początkowa właściwości: $({0})=„{1}” Źródło: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: W przypadku projektu „{0}” pominięto ograniczenia izolacji grafu dla przywoływanego projektu „{1}” diff --git a/src/Build/Resources/xlf/Strings.pt-BR.xlf b/src/Build/Resources/xlf/Strings.pt-BR.xlf index a3c9bafe4a3..68cf6eb5dd8 100644 --- a/src/Build/Resources/xlf/Strings.pt-BR.xlf +++ b/src/Build/Resources/xlf/Strings.pt-BR.xlf @@ -257,6 +257,11 @@ Valor inicial da propriedade: $({0})="{1}" Origem: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: o projeto "{0}" ignorou as restrições de isolamento do gráfico no projeto referenciado "{1}" diff --git a/src/Build/Resources/xlf/Strings.ru.xlf b/src/Build/Resources/xlf/Strings.ru.xlf index ea7ac3894a8..51547011c53 100644 --- a/src/Build/Resources/xlf/Strings.ru.xlf +++ b/src/Build/Resources/xlf/Strings.ru.xlf @@ -257,6 +257,11 @@ Начальное значение свойства: $({0})="{1}" Источник: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: проект "{0}" пропустил ограничения изоляции графа в проекте "{1}", на который указывает ссылка. diff --git a/src/Build/Resources/xlf/Strings.tr.xlf b/src/Build/Resources/xlf/Strings.tr.xlf index 095ce39a05d..1cc28ff9a8e 100644 --- a/src/Build/Resources/xlf/Strings.tr.xlf +++ b/src/Build/Resources/xlf/Strings.tr.xlf @@ -257,6 +257,11 @@ Özellik başlangıç değeri: $({0})="{1}" Kaynak: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: "{0}" projesi, başvurulan "{1}" projesindeki graf yalıtımı kısıtlamalarını atladı diff --git a/src/Build/Resources/xlf/Strings.zh-Hans.xlf b/src/Build/Resources/xlf/Strings.zh-Hans.xlf index b976c8e4d9d..4059cf492db 100644 --- a/src/Build/Resources/xlf/Strings.zh-Hans.xlf +++ b/src/Build/Resources/xlf/Strings.zh-Hans.xlf @@ -257,6 +257,11 @@ 属性初始值: $({0})=“{1}”,源: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: 项目“{0}”已跳过所引用的项目“{1}”上的图形隔离约束 diff --git a/src/Build/Resources/xlf/Strings.zh-Hant.xlf b/src/Build/Resources/xlf/Strings.zh-Hant.xlf index ddebd381fbe..898c29d736e 100644 --- a/src/Build/Resources/xlf/Strings.zh-Hant.xlf +++ b/src/Build/Resources/xlf/Strings.zh-Hant.xlf @@ -257,6 +257,11 @@ 屬性初始值: $({0})="{1}" 來源: {2} + + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + MSB4274: Disabling the inproc node leads to performance degradation when using project cache plugins that emit proxy build requests. + + MSB4260: Project "{0}" skipped graph isolation constraints on referenced project "{1}" MSB4260: 專案 "{0}" 已跳過參考專案 "{1}" 上的圖形隔離條件約束