diff --git a/src/Microsoft.Extensions.SecretManager.Tools/Internal/ProjectIdResolver.cs b/src/Microsoft.Extensions.SecretManager.Tools/Internal/ProjectIdResolver.cs index cf3105cea2..66d08b008b 100644 --- a/src/Microsoft.Extensions.SecretManager.Tools/Internal/ProjectIdResolver.cs +++ b/src/Microsoft.Extensions.SecretManager.Tools/Internal/ProjectIdResolver.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Linq; using System.Reflection; using Microsoft.Extensions.CommandLineUtils; using Microsoft.Extensions.Tools.Internal; @@ -14,19 +15,20 @@ namespace Microsoft.Extensions.SecretManager.Tools.Internal { private const string DefaultConfig = "Debug"; private readonly IReporter _reporter; + private readonly string _targetsFile; private readonly string _workingDirectory; public ProjectIdResolver(IReporter reporter, string workingDirectory) { _workingDirectory = workingDirectory; _reporter = reporter; + _targetsFile = FindTargetsFile(); } public string Resolve(string project, string configuration) { var finder = new MsBuildProjectFinder(_workingDirectory); var projectFile = finder.FindMsBuildProject(project); - EnsureProjectExtensionTargetsExist(projectFile); _reporter.Verbose(Resources.FormatMessage_Project_File_Path(projectFile)); @@ -42,9 +44,11 @@ namespace Microsoft.Extensions.SecretManager.Tools.Internal "msbuild", projectFile, "/nologo", - "/t:_ExtractUserSecretsMetadata", // defined in ProjectIdResolverTargets.xml - $"/p:_UserSecretsMetadataFile={outputFile}", - $"/p:Configuration={configuration}" + "/t:_ExtractUserSecretsMetadata", // defined in SecretManager.targets + "/p:_UserSecretsMetadataFile=" + outputFile, + "/p:Configuration=" + configuration, + "/p:CustomAfterMicrosoftCommonTargets=" + _targetsFile, + "/p:CustomAfterMicrosoftCommonCrossTargetingTargets=" + _targetsFile, }; var psi = new ProcessStartInfo { @@ -82,25 +86,25 @@ namespace Microsoft.Extensions.SecretManager.Tools.Internal } } - private void EnsureProjectExtensionTargetsExist(string projectFile) + private string FindTargetsFile() { - // relies on MSBuildProjectExtensionsPath and Microsoft.Common.targets to import this file - // into the target project - var projectExtensionsPath = Path.Combine( - Path.GetDirectoryName(projectFile), - "obj", - $"{Path.GetFileName(projectFile)}.usersecrets.targets"); - - Directory.CreateDirectory(Path.GetDirectoryName(projectExtensionsPath)); - - // should overwrite the file always. Hypothetically, another version of the user-secrets tool - // could have already put a file here. We want to ensure the target file matches the currently - // running tool - using (var resource = GetType().GetTypeInfo().Assembly.GetManifestResourceStream("ProjectIdResolverTargets.xml")) - using (var stream = new FileStream(projectExtensionsPath, FileMode.Create)) + var assemblyDir = Path.GetDirectoryName(typeof(ProjectIdResolver).Assembly.Location); + var searchPaths = new[] { - resource.CopyTo(stream); + AppContext.BaseDirectory, + assemblyDir, + Path.Combine(assemblyDir, "../../toolassets"), // from nuget cache + Path.Combine(assemblyDir, "toolassets"), // from local build + Path.Combine(AppContext.BaseDirectory, "../../toolassets"), // relative to packaged deps.json + }; + + var targetPath = searchPaths.Select(p => Path.Combine(p, "SecretManager.targets")).FirstOrDefault(File.Exists); + if (targetPath == null) + { + _reporter.Error("Fatal error: could not find SecretManager.targets"); + return null; } + return targetPath; } private static void TryDelete(string file) diff --git a/src/Microsoft.Extensions.SecretManager.Tools/Microsoft.Extensions.SecretManager.Tools.csproj b/src/Microsoft.Extensions.SecretManager.Tools/Microsoft.Extensions.SecretManager.Tools.csproj index aaf954865a..261b94791f 100644 --- a/src/Microsoft.Extensions.SecretManager.Tools/Microsoft.Extensions.SecretManager.Tools.csproj +++ b/src/Microsoft.Extensions.SecretManager.Tools/Microsoft.Extensions.SecretManager.Tools.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/src/Microsoft.Extensions.SecretManager.Tools/resources/ProjectIdResolverTargets.xml b/src/Microsoft.Extensions.SecretManager.Tools/resources/ProjectIdResolverTargets.xml deleted file mode 100644 index a30a87d34a..0000000000 --- a/src/Microsoft.Extensions.SecretManager.Tools/resources/ProjectIdResolverTargets.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.SecretManager.Tools/toolassets/SecretManager.targets b/src/Microsoft.Extensions.SecretManager.Tools/toolassets/SecretManager.targets new file mode 100644 index 0000000000..8cf63eac00 --- /dev/null +++ b/src/Microsoft.Extensions.SecretManager.Tools/toolassets/SecretManager.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/test/Microsoft.Extensions.SecretManager.Tools.Tests/Microsoft.Extensions.SecretManager.Tools.Tests.csproj b/test/Microsoft.Extensions.SecretManager.Tools.Tests/Microsoft.Extensions.SecretManager.Tools.Tests.csproj index 5ac356aa2e..67ace090c0 100644 --- a/test/Microsoft.Extensions.SecretManager.Tools.Tests/Microsoft.Extensions.SecretManager.Tools.Tests.csproj +++ b/test/Microsoft.Extensions.SecretManager.Tools.Tests/Microsoft.Extensions.SecretManager.Tools.Tests.csproj @@ -6,6 +6,7 @@ + diff --git a/test/Microsoft.Extensions.SecretManager.Tools.Tests/MsBuildProjectFinderTest.cs b/test/Microsoft.Extensions.SecretManager.Tools.Tests/MsBuildProjectFinderTest.cs index ec79f8ef4a..6e7a290834 100644 --- a/test/Microsoft.Extensions.SecretManager.Tools.Tests/MsBuildProjectFinderTest.cs +++ b/test/Microsoft.Extensions.SecretManager.Tools.Tests/MsBuildProjectFinderTest.cs @@ -5,7 +5,7 @@ using System.IO; using Microsoft.Extensions.SecretManager.Tools.Internal; using Xunit; -namespace Microsoft.Extensions.SecretsManager.Tools.Tests +namespace Microsoft.Extensions.SecretManager.Tools.Tests { public class MsBuildProjectFinderTest { diff --git a/test/Microsoft.Extensions.SecretManager.Tools.Tests/TemporaryFileProvider.cs b/test/Microsoft.Extensions.SecretManager.Tools.Tests/TemporaryFileProvider.cs index 08e4449d0c..34c2e8e2ba 100644 --- a/test/Microsoft.Extensions.SecretManager.Tools.Tests/TemporaryFileProvider.cs +++ b/test/Microsoft.Extensions.SecretManager.Tools.Tests/TemporaryFileProvider.cs @@ -5,7 +5,7 @@ using System; using System.IO; using System.Text; -namespace Microsoft.Extensions.SecretsManager.Tools.Tests +namespace Microsoft.Extensions.SecretManager.Tools.Tests { internal class TemporaryFileProvider : IDisposable { @@ -26,4 +26,4 @@ namespace Microsoft.Extensions.SecretsManager.Tools.Tests Directory.Delete(Root, recursive: true); } } -} \ No newline at end of file +}