예제 #1
0
        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);
        }