예제 #1
0
        public void Execute(CommandLineApplication command)
        {
            command.Description = "Install SkyWalking .NET Core Agent";
            command.HelpOption();

            var upgradeOption = command.Option("-u|--upgrade", "Upgrade SkyWalking .NET Core Agent", CommandOptionType.NoValue);

            command.OnExecute(() =>
            {
                ConsoleUtils.WriteWelcome();
                Console.WriteLine(upgradeOption.HasValue() ? "Upgrading SkyWalking .NET Core Agent ..." : "Installing SkyWalking .NET Core Agent ...");
                Console.WriteLine();

                var workDir     = Path.Combine(_directoryProvider.TmpDirectory, _directoryProvider.AgentPath);
                var workDirInfo = new DirectoryInfo(workDir);
                if (workDirInfo.Exists)
                {
                    workDirInfo.Delete(true);
                }
                workDirInfo.Create();

                Console.WriteLine("Create tmp directory '{0}'", workDir);

                var hostingStartupDir = Path.Combine(workDir, "repo");

                var shell = _processFactory.Create(Shell);
                shell.Exec($"git clone {git_hosting_startup} {hostingStartupDir}");
                shell.Exec($"cd {Path.Combine(hostingStartupDir, "manifest")}");
                shell.Exec("dotnet build --configuration Release --verbosity q -nowarn:NU1701");
                shell.Exec($"dotnet store --manifest {manifest_proj} --framework netcoreapp2.1 --output {_directoryProvider.StoreDirectory} --runtime {Runtime} --skip-symbols --verbosity q -nowarn:NU1701");

                var code = _processFactory.Release(shell);
                if (code != 0)
                {
                    return(code);
                }

                //add dotnet additonalDeps
                var additonalDepsPath    = _directoryProvider.GetAdditonalDepsPath(_directoryProvider.AgentPath, "2.1.0");
                var additonalDepsDirInfo = new DirectoryInfo(additonalDepsPath);
                if (!additonalDepsDirInfo.Exists)
                {
                    additonalDepsDirInfo.Create();
                    Console.WriteLine("Create dotnet additonalDeps directory '{0}'", additonalDepsPath);
                }

                var depsJsonFilePath = Path.Combine(hostingStartupDir, "manifest", "bin", "Release", "netcoreapp2.1", "SkyWalking.Runtime.Store.deps.json");
                var depsContent      = File.ReadAllText(depsJsonFilePath);
                var depsObject       = JsonConvert.DeserializeObject <DepsObject>(depsContent);
                foreach (var target in depsObject.Targets)
                {
                    target.Value?.Remove(invalid_node_name);
                }
                depsObject.Libraries.Remove(invalid_node_name);
                var depsFile = new FileInfo(Path.Combine(additonalDepsPath, $"{_directoryProvider.AgentPath}.deps.json"));
                using (var writer = depsFile.CreateText())
                    writer.Write(JsonConvert.SerializeObject(depsObject, Formatting.Indented));

                Console.WriteLine("Create deps config to {0}", depsFile.FullName);

                _platformInformation.Invoke(rmWorkDir_Win, rmWorkDir, rmWorkDir, rmWorkDir);
                Console.WriteLine("Clean tmp directory '{0}'", workDir);

                Console.WriteLine();
                Console.WriteLine("SkyWalking .NET Core Agent was successfully installed.");

                return(0);

                void rmWorkDir_Win()
                {
                    var cmd = _processFactory.Create("cmd.exe");
                    cmd.Exec($"rmdir /s/q {workDir}");
                    _processFactory.Release(cmd);
                }
                void rmWorkDir() => workDirInfo.Delete(true);
            });
        }