예제 #1
0
        private static int SourceToSource(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Usage: <ArgumentsFile>");
                return(-2);
            }

            using (new AssemblyResolver())
            {
                var cmd      = new CodeGeneratorCommand();
                var logLevel = LogLevel.Warning;

                var argsFile = args[0].Trim('"');
                if (!File.Exists(argsFile))
                {
                    throw new ArgumentException($"Arguments file \"{argsFile}\" does not exist.");
                }

                var fileArgs = File.ReadAllLines(argsFile);
                foreach (var arg in fileArgs)
                {
                    var parts = arg.Split(new[] { ':' }, 2);
                    if (parts.Length > 2)
                    {
                        throw new ArgumentException($"Argument \"{arg}\" cannot be parsed.");
                    }
                    var key   = parts[0];
                    var value = parts.Skip(1).SingleOrDefault();
                    switch (key)
                    {
                    case "WaitForDebugger":
                        var i = 0;
                        while (!Debugger.IsAttached)
                        {
                            if (i++ % 50 == 0)
                            {
                                Console.WriteLine("Waiting for debugger to attach.");
                            }

                            Thread.Sleep(100);
                        }

                        break;

                    case nameof(cmd.ProjectGuid):
                        cmd.ProjectGuid = value;
                        break;

                    case nameof(cmd.ProjectPath):
                        cmd.ProjectPath = value;
                        break;

                    case nameof(cmd.OutputType):
                        cmd.OutputType = value;
                        break;

                    case nameof(cmd.TargetPath):
                        cmd.TargetPath = value;
                        break;

                    case nameof(cmd.AssemblyName):
                        cmd.AssemblyName = value;
                        break;

                    case nameof(cmd.Compile):
                        cmd.Compile.Add(value);
                        break;

                    case nameof(cmd.Reference):
                        cmd.Reference.Add(value);
                        break;

                    case nameof(cmd.DefineConstants):
                        cmd.DefineConstants.AddRange(value.Split(',', StringSplitOptions.RemoveEmptyEntries));
                        break;

                    case nameof(cmd.CodeGenOutputFile):
                        cmd.CodeGenOutputFile = value;
                        break;

                    case nameof(cmd.DebuggerStepThrough):
                        cmd.DebuggerStepThrough = bool.Parse(value);
                        break;

                    case "InputHash":
                        break;

                    case nameof(LogLevel):
                        if (!Enum.TryParse(ignoreCase: true, value: value, result: out logLevel))
                        {
                            var validValues = string.Join(", ", Enum.GetNames(typeof(LogLevel)).Select(v => v.ToString()));
                            Console.WriteLine($"ERROR: \"{value}\" is not a valid log level. Valid values are {validValues}");
                            return(-3);
                        }

                        break;

                    default:
                        PrintUsage();
                        throw new ArgumentOutOfRangeException($"Key \"{key}\" in argument file is unknown.");
                    }
                }

                var services = new ServiceCollection()
                               .AddLogging(logging =>
                {
                    logging
                    .SetMinimumLevel(logLevel)
                    .AddConsole()
                    .AddDebug();
                })
                               .BuildServiceProvider();
                cmd.Log = services.GetRequiredService <ILoggerFactory>().CreateLogger("Orleans.CodeGenerator");
                var stopwatch = Stopwatch.StartNew();
                var ok        = cmd.Execute(CancellationToken.None).GetAwaiter().GetResult();
                cmd.Log.LogInformation($"Total code generation time: {stopwatch.ElapsedMilliseconds}ms.");

                if (ok)
                {
                    return(0);
                }
            }

            return(-1);
        }
예제 #2
0
        private static int SourceToSource(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Usage: <ArgumentsFile>");
                return(-2);
            }

            using (new AssemblyResolver())
            {
                var cmd      = new CodeGeneratorCommand();
                var argsFile = args[0].Trim('"');
                if (!File.Exists(argsFile))
                {
                    throw new ArgumentException($"Arguments file \"{argsFile}\" does not exist.");
                }

                var fileArgs = File.ReadAllLines(argsFile);
                foreach (var arg in fileArgs)
                {
                    var parts = arg.Split(new[] { ':' }, 2);
                    if (parts.Length > 2)
                    {
                        throw new ArgumentException($"Argument \"{arg}\" cannot be parsed.");
                    }
                    var key   = parts[0];
                    var value = parts.Skip(1).SingleOrDefault();
                    switch (key)
                    {
                    case "WaitForDebugger":
                        var i = 0;
                        while (!Debugger.IsAttached)
                        {
                            if (i++ % 50 == 0)
                            {
                                Console.WriteLine("Waiting for debugger to attach.");
                            }

                            Thread.Sleep(100);
                        }

                        break;

                    case nameof(cmd.ProjectGuid):
                        cmd.ProjectGuid = value;
                        break;

                    case nameof(cmd.ProjectPath):
                        cmd.ProjectPath = value;
                        break;

                    case nameof(cmd.OutputType):
                        cmd.OutputType = value;
                        break;

                    case nameof(cmd.TargetPath):
                        cmd.TargetPath = value;
                        break;

                    case nameof(cmd.AssemblyName):
                        cmd.AssemblyName = value;
                        break;

                    case nameof(cmd.Compile):
                        cmd.Compile.Add(value);
                        break;

                    case nameof(cmd.Reference):
                        cmd.Reference.Add(value);
                        break;

                    case nameof(cmd.DefineConstants):
                        cmd.DefineConstants.AddRange(value.Split(',', StringSplitOptions.RemoveEmptyEntries));
                        break;

                    case nameof(cmd.CodeGenOutputFile):
                        cmd.CodeGenOutputFile = value;
                        break;

                    case nameof(cmd.DebuggerStepThrough):
                        cmd.DebuggerStepThrough = bool.Parse(value);
                        break;

                    case "InputHash":
                        break;

                    case "LogLevel":
                        break;

                    default:
                        PrintUsage();
                        throw new ArgumentOutOfRangeException($"Key \"{key}\" in argument file is unknown.");
                    }
                }

                var ok = cmd.Execute(CancellationToken.None).GetAwaiter().GetResult();
                if (ok)
                {
                    return(0);
                }
            }

            return(-1);
        }