Browse Source

Merge pull request #15692 from abpframework/volo/issues/13480

Cli: Enhancements related with starting ABP Suite
pull/15705/head
Alper Ebiçoğlu 3 years ago
committed by GitHub
parent
commit
0daf09f15e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 94
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SuiteAppSettingsService.cs
  2. 65
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs

94
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SuiteAppSettingsService.cs

@ -0,0 +1,94 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Commands.Services;
public class SuiteAppSettingsService : ITransientDependency
{
private const int DefaultPort = 3000;
public CmdHelper CmdHelper { get; }
public SuiteAppSettingsService(CmdHelper cmdHelper)
{
CmdHelper = cmdHelper;
}
public async Task<int> GetSuitePortAsync()
{
return await GetSuitePortAsync(GetCurrentSuiteVersion());
}
public async Task<int> GetSuitePortAsync(string version)
{
var filePath = GetFilePathOrNull(version);
if (filePath == null)
{
return DefaultPort;
}
var content = File.ReadAllText(filePath);
var contentAsJson = JObject.Parse(content);
var url = contentAsJson["AbpSuite"]?["ApplicationUrl"]?.ToString();
if (url == null)
{
return DefaultPort;
}
return Convert.ToInt32(url.Split(":").Last());
}
private string GetFilePathOrNull(string version)
{
if (version == null)
{
return null;
}
var path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
".dotnet",
"tools",
".store",
"volo.abp.suite",
version,
"volo.abp.suite",
version,
"tools",
"net7.0",
"any",
"appsettings.json"
);
if (!File.Exists(path))
{
return null;
}
return path;
}
private string GetCurrentSuiteVersion()
{
var dotnetToolList = CmdHelper.RunCmdAndGetOutput("dotnet tool list -g", out int exitCode);
var suiteLine = dotnetToolList.Split(Environment.NewLine)
.FirstOrDefault(l => l.ToLower().StartsWith("volo.abp.suite "));
if (string.IsNullOrEmpty(suiteLine))
{
return null;
}
return suiteLine.Split(" ", StringSplitOptions.RemoveEmptyEntries)[1];
}
}

65
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs

@ -35,23 +35,26 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
private readonly NuGetService _nuGetService;
private readonly AuthService _authService;
private readonly CliHttpClientFactory _cliHttpClientFactory;
private readonly SuiteAppSettingsService _suiteAppSettingsService;
private const string SuitePackageName = "Volo.Abp.Suite";
public ILogger<SuiteCommand> Logger { get; set; }
private const string AbpSuiteHost = "http://localhost:3000";
private int _abpSuitePort = 3000;
public SuiteCommand(
AbpNuGetIndexUrlService nuGetIndexUrlService,
NuGetService nuGetService,
ICmdHelper cmdHelper,
AuthService authService,
CliHttpClientFactory cliHttpClientFactory)
CliHttpClientFactory cliHttpClientFactory,
SuiteAppSettingsService suiteAppSettingsService)
{
CmdHelper = cmdHelper;
_nuGetIndexUrlService = nuGetIndexUrlService;
_nuGetService = nuGetService;
_authService = authService;
_cliHttpClientFactory = cliHttpClientFactory;
_suiteAppSettingsService = suiteAppSettingsService;
Logger = NullLogger<SuiteCommand>.Instance;
}
@ -72,17 +75,20 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
commandLineArgs.Options.ContainsKey(Options.Preview.Long);
var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long);
var currentSuiteVersionAsString = GetCurrentSuiteVersion();
switch (operationType)
{
case "":
case null:
await InstallSuiteIfNotInstalledAsync();
await InstallSuiteIfNotInstalledAsync(currentSuiteVersionAsString);
_abpSuitePort = await _suiteAppSettingsService.GetSuitePortAsync(currentSuiteVersionAsString);
RunSuite();
break;
case "generate":
await InstallSuiteIfNotInstalledAsync();
await InstallSuiteIfNotInstalledAsync(currentSuiteVersionAsString);
_abpSuitePort = await _suiteAppSettingsService.GetSuitePortAsync(currentSuiteVersionAsString);
var suiteProcess = StartSuite();
System.Threading.Thread.Sleep(500); //wait for initialization of the app
await GenerateCrudPageAsync(commandLineArgs);
@ -130,7 +136,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
var IsSolutionBuiltResponse = await client.GetAsync(
$"{AbpSuiteHost}/api/abpSuite/solutions/{solutionId.ToString()}/is-built"
$"http://localhost:{_abpSuitePort}/api/abpSuite/solutions/{solutionId.ToString()}/is-built"
);
var IsSolutionBuilt = Convert.ToBoolean(await IsSolutionBuiltResponse.Content.ReadAsStringAsync());
@ -148,7 +154,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
);
var responseMessage = await client.PostAsync(
$"{AbpSuiteHost}/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity",
$"http://localhost:{_abpSuitePort}/api/abpSuite/crudPageGenerator/{solutionId.ToString()}/save-and-generate-entity",
entityContent
);
@ -178,7 +184,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
var responseMessage = await client.GetHttpResponseMessageWithRetryAsync(
"http://localhost:3000/api/abpSuite/solutions",
$"http://localhost:{_abpSuitePort}/api/abpSuite/solutions",
_cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10)),
Logger,
timeIntervals.ToArray());
@ -216,7 +222,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
);
var responseMessage = await client.PostAsync(
"http://localhost:3000/api/abpSuite/addSolution",
$"http://localhost:{_abpSuitePort}/api/abpSuite/addSolution",
entityContent,
_cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10))
);
@ -234,11 +240,9 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
}
private async Task InstallSuiteIfNotInstalledAsync()
private async Task InstallSuiteIfNotInstalledAsync(string currentSuiteVersion)
{
var currentSuiteVersionAsString = GetCurrentSuiteVersion();
if (string.IsNullOrEmpty(currentSuiteVersionAsString))
if (string.IsNullOrEmpty(currentSuiteVersion))
{
await InstallSuiteAsync();
}
@ -430,6 +434,19 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
Logger.LogWarning("Couldn't check ABP Suite installed status: " + ex.Message);
}
if (IsSuiteAlreadyRunning())
{
Logger.LogInformation("Opening suite...");
CmdHelper.Open($"http://localhost:{_abpSuitePort}");
return;
}
if (IsPortAlreadyInUse())
{
Logger.LogError($"Port \"{_abpSuitePort}\" is already in use.");
return;
}
CmdHelper.RunCmd("abp-suite");
}
@ -453,23 +470,32 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
return null;
}
if (IsPortAlreadyInUse())
{
Logger.LogError($"Port \"{_abpSuitePort}\" is already in use.");
return null;
}
return CmdHelper.RunCmdAndGetProcess("abp-suite --no-browser");
}
private bool IsSuiteAlreadyRunning()
{
return GetProcessesRelatedWithSuite().Any();
}
private bool IsPortAlreadyInUse()
{
var ipGP = IPGlobalProperties.GetIPGlobalProperties();
var endpoints = ipGP.GetActiveTcpListeners();
return endpoints.Any(e => e.Port == 3000);
return endpoints.Any(e => e.Port == _abpSuitePort);
}
private void KillSuite()
{
try
{
var suiteProcesses = (from p in Process.GetProcesses()
where p.ProcessName.ToLower().Contains("abp-suite")
select p);
var suiteProcesses = GetProcessesRelatedWithSuite();
foreach (var suiteProcess in suiteProcesses)
{
@ -483,6 +509,13 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency
}
}
private IEnumerable<Process> GetProcessesRelatedWithSuite()
{
return (from p in Process.GetProcesses()
where p.ProcessName.ToLower().Contains("abp-suite")
select p);
}
public string GetUsageInfo()
{
var sb = new StringBuilder();

Loading…
Cancel
Save