예제 #1
0
파일: PackCommand.cs 프로젝트: sizzles/Rant
        protected override void OnRun()
        {
            var  pkg      = new RantPackage();
            var  paths    = CmdLine.GetPaths();
            bool compress = !CmdLine.Flag("no-compress");

            Console.WriteLine("Packing...");

            string contentDir = Path.GetFullPath(paths.Length == 0 ? Environment.CurrentDirectory : paths[0]);

            Pack(pkg, contentDir);

            string outputPath;
            string infoPath = Path.Combine(contentDir, "rantpkg.json");

            if (!File.Exists(infoPath))
            {
                throw new FileNotFoundException("rantpkg.json missing from root directory.");
            }

            var info = JsonConvert.DeserializeObject <PackInfo>(File.ReadAllText(infoPath));

            pkg.Title       = info.Title;
            pkg.Authors     = info.Authors;
            pkg.Version     = RantPackageVersion.Parse(!string.IsNullOrWhiteSpace(CmdLine.Property("version")) ? CmdLine.Property("version") : info.Version);
            pkg.Description = info.Description;
            pkg.ID          = info.ID;
            pkg.Tags        = info.Tags;

            foreach (var dep in info.Dependencies)
            {
                pkg.AddDependency(dep);
            }

            // -out property overrides rantpkg.json's output path
            if (!string.IsNullOrWhiteSpace(CmdLine.Property("out")))
            {
                outputPath = Path.Combine(CmdLine.Property("out"), $"{pkg.ID}-{pkg.Version}.rantpkg");
                Directory.CreateDirectory(CmdLine.Property("out"));
            }
            // Otherwise, use rantpkg.json's "out" property
            else if (!string.IsNullOrWhiteSpace(info.OutputPath))
            {
                outputPath = Path.Combine(contentDir, info.OutputPath, $"{pkg.ID}-{pkg.Version}.rantpkg");
                Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
            }
            // If it doesn't have one, put it in the package content directory
            else
            {
                outputPath = Path.Combine(Directory.GetParent(contentDir).FullName, $"{pkg.ID}-{pkg.Version}.rantpkg");
            }

            Console.WriteLine($"Compression: {(compress ? "yes" : "no")}");

            Console.WriteLine(compress ? "Compressing and saving..." : "Saving...");
            pkg.Save(outputPath, compress);

            Console.WriteLine("\nPackage saved to " + outputPath.Replace('\\', '/'));

            Console.ResetColor();
        }