Improved plugin feature
This commit is contained in:
parent
8f82360cc7
commit
457429f7ec
@ -10,21 +10,29 @@ public partial class MycroForge
|
|||||||
{
|
{
|
||||||
public class Init : Command, ISubCommandOf<Plugin>
|
public class Init : Command, ISubCommandOf<Plugin>
|
||||||
{
|
{
|
||||||
private static readonly Argument<string> NameArgument =
|
private static readonly Argument<string> NamespaceArgument =
|
||||||
new(name: "name", description: "The name of your project");
|
new(name: "namespace", description: "The namespace of your project");
|
||||||
|
|
||||||
|
private static readonly Argument<string> ClassArgument =
|
||||||
|
new(name: "class", description: "The class name of the generated command");
|
||||||
|
|
||||||
|
private static readonly Argument<string> CommandArgument =
|
||||||
|
new(name: "command", description: "The command name that will be added to 'm4g'");
|
||||||
|
|
||||||
private readonly ProjectContext _context;
|
private readonly ProjectContext _context;
|
||||||
|
|
||||||
public Init(ProjectContext context) : base("init", "Initialize a basic plugin project")
|
public Init(ProjectContext context) : base("init", "Initialize a basic plugin project")
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
AddArgument(NameArgument);
|
AddArgument(NamespaceArgument);
|
||||||
this.SetHandler(ExecuteAsync, NameArgument);
|
AddArgument(ClassArgument);
|
||||||
|
AddArgument(CommandArgument);
|
||||||
|
this.SetHandler(ExecuteAsync, NamespaceArgument, ClassArgument, CommandArgument);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ExecuteAsync(string name)
|
private async Task ExecuteAsync(string @namespace, string @class, string command)
|
||||||
{
|
{
|
||||||
await _context.Bash($"dotnet new m4gp -n {name}");
|
await _context.Bash($"dotnet new m4gp -n {@namespace} --class {@class} --command {command}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,9 +44,13 @@ public partial class MycroForge
|
|||||||
var assemblyName = GetAssemblyName();
|
var assemblyName = GetAssemblyName();
|
||||||
var pluginInstallPath = Path.Join(Plugins.RootDirectory, assemblyName);
|
var pluginInstallPath = Path.Join(Plugins.RootDirectory, assemblyName);
|
||||||
var platform = target.ToString().Dasherize();
|
var platform = target.ToString().Dasherize();
|
||||||
await _context.Bash($"dotnet publish -c Release -r {platform} --output {pluginInstallPath}");
|
var exitCode = await _context.Bash(
|
||||||
Console.WriteLine($"Successfully installed plugin {assemblyName}");
|
$"dotnet publish -c Release -r {platform} --output {pluginInstallPath}"
|
||||||
|
);
|
||||||
|
|
||||||
|
Console.WriteLine(exitCode == 0
|
||||||
|
? $"Successfully installed plugin {assemblyName}"
|
||||||
|
: $"Could not install {assemblyName}, process exited with code {exitCode}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetAssemblyName()
|
private string GetAssemblyName()
|
||||||
|
@ -70,7 +70,7 @@ public class ProjectContext
|
|||||||
Console.WriteLine($"Modified file {path}");
|
Console.WriteLine($"Modified file {path}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Bash(params string[] script)
|
public async Task<int> Bash(params string[] script)
|
||||||
{
|
{
|
||||||
var info = new ProcessStartInfo
|
var info = new ProcessStartInfo
|
||||||
{
|
{
|
||||||
@ -112,6 +112,8 @@ public class ProjectContext
|
|||||||
|
|
||||||
await process.WaitForExitAsync();
|
await process.WaitForExitAsync();
|
||||||
Environment.ExitCode = process.ExitCode;
|
Environment.ExitCode = process.ExitCode;
|
||||||
|
|
||||||
|
return process.ExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveConfig(ProjectConfig config)
|
public async Task SaveConfig(ProjectConfig config)
|
||||||
|
@ -17,5 +17,16 @@
|
|||||||
"language": "C#",
|
"language": "C#",
|
||||||
"type": "project"
|
"type": "project"
|
||||||
},
|
},
|
||||||
"preferNameDirectory": true
|
"preferNameDirectory": true,
|
||||||
|
"symbols": {
|
||||||
|
"class": {
|
||||||
|
"type": "parameter",
|
||||||
|
"replaces": "ExampleCommand",
|
||||||
|
"fileRename": "ExampleCommand"
|
||||||
|
},
|
||||||
|
"command": {
|
||||||
|
"type": "parameter",
|
||||||
|
"replaces": "example"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -5,7 +5,7 @@ using RootCommand = MycroForge.Core.RootCommand;
|
|||||||
|
|
||||||
namespace MycroForge.PluginTemplate;
|
namespace MycroForge.PluginTemplate;
|
||||||
|
|
||||||
public class HelloWorldCommand : Command, ISubCommandOf<RootCommand>
|
public class ExampleCommand : Command, ISubCommandOf<RootCommand>
|
||||||
{
|
{
|
||||||
private readonly Argument<string> NameArgument =
|
private readonly Argument<string> NameArgument =
|
||||||
new(name: "name", description: "The name of the person to greet");
|
new(name: "name", description: "The name of the person to greet");
|
||||||
@ -15,8 +15,8 @@ public class HelloWorldCommand : Command, ISubCommandOf<RootCommand>
|
|||||||
|
|
||||||
private readonly ProjectContext _context;
|
private readonly ProjectContext _context;
|
||||||
|
|
||||||
public HelloWorldCommand(ProjectContext context) :
|
public ExampleCommand(ProjectContext context) :
|
||||||
base("hello", "An example command generated by dotnet new using the m4gp template")
|
base("example", "A basic command plugin generated by the 'm4g plugin init' command")
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
AddArgument(NameArgument);
|
AddArgument(NameArgument);
|
||||||
@ -28,9 +28,9 @@ public class HelloWorldCommand : Command, ISubCommandOf<RootCommand>
|
|||||||
{
|
{
|
||||||
name = allCaps ? name.ToUpper() : name;
|
name = allCaps ? name.ToUpper() : name;
|
||||||
|
|
||||||
await _context.CreateFile("hello_world.txt",
|
await _context.CreateFile("example.txt",
|
||||||
$"Hello {name}!",
|
$"Hello {name}!",
|
||||||
"This file was generated by your custom command!"
|
"This file was generated by the 'm4g example' command!"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,12 +4,12 @@ using RootCommand = MycroForge.Core.RootCommand;
|
|||||||
|
|
||||||
namespace MycroForge.PluginTemplate;
|
namespace MycroForge.PluginTemplate;
|
||||||
|
|
||||||
public class HelloWorldCommandPlugin : ICommandPlugin
|
public class ExampleCommandPlugin : ICommandPlugin
|
||||||
{
|
{
|
||||||
public string Name => "MycroForge.PluginTemplate";
|
public string Name => "MycroForge.PluginTemplate";
|
||||||
|
|
||||||
public void RegisterServices(IServiceCollection services)
|
public void RegisterServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddScoped<ISubCommandOf<RootCommand>, HelloWorldCommand>();
|
services.AddScoped<ISubCommandOf<RootCommand>, ExampleCommand>();
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user