public async Task CheckDeveloperTargetRedirects(string id, PackageVersion version, string realPath) { var nupkgFile = Path.Combine(Environment.ExpandEnvironmentVariables(store.DevSource), $"{id}.{version}.nupkg"); var isRedirectToCurrentPath = false; var installedPackage = store.GetLocalPackages(id).FirstOrDefault(x => x.Version == version); if (installedPackage != null) { var redirectFile = Path.Combine(installedPackage.Path, $@"{id}.redirect"); if (File.Exists(redirectFile) && String.Compare(File.ReadAllText(redirectFile), realPath, StringComparison.OrdinalIgnoreCase) == 0) { isRedirectToCurrentPath = true; } } // Note: later, we could do better and check existing package contents and scan for differences? // We could also delete older packages using same path if (File.Exists(nupkgFile) && isRedirectToCurrentPath) { return; } Directory.CreateDirectory(Path.GetDirectoryName(nupkgFile)); var builder = new NugetPackageBuilder(); var meta = new PackageMeta { Name = id, Version = version, Authors = { $"{id} developers" }, Description = $"{id} developer package using {realPath}", }; var nugetMeta = new ManifestMetadata(); ToNugetManifest(meta, nugetMeta); builder.Populate(nugetMeta); // Note: path must exist (created in NugetStore ctor) using (var tempDirectory = new TemporaryDirectory()) { // Generate fake files Directory.CreateDirectory(Path.Combine(tempDirectory.DirectoryPath, "build")); var files = new List <ManifestFile>(); foreach (var buildFileExtension in new[] { "targets", "props" }) { var source = Path.Combine(tempDirectory.DirectoryPath, $@"build\{id}.{buildFileExtension}"); File.WriteAllText(source, $@"<?xml version=""1.0"" encoding=""utf-8"" ?> <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" > <Import Project=""{realPath}\Targets\Xenko.{buildFileExtension}"" /> </Project> "); files.Add(new ManifestFile { Source = source, Target = $@"build\{id}.{buildFileExtension}" }); } var redirectFile = Path.Combine(tempDirectory.DirectoryPath, $"{id}.redirect"); File.WriteAllText(redirectFile, realPath); files.Add(new ManifestFile { Source = redirectFile, Target = $@"{id}.redirect" }); builder.PopulateFiles(".", files); using (var nupkgStream = File.OpenWrite(nupkgFile)) { builder.Save(nupkgStream); } } // If package is already installed in cache so that it will force reinstallation. if (installedPackage != null) { await store.UninstallPackage(installedPackage, null); } await store.InstallPackage(id, version, null); }