Browse Source

Merge pull request #18629 from abpframework/cli-version-warning

Output warning if the cli version is different from the template version.
pull/18637/head
Engincan VESKE 3 years ago
committed by GitHub
parent
commit
fd86913e8b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 46
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
  2. 69
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs
  3. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs
  4. 49
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

46
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

@ -29,6 +29,7 @@ public class CliService : ITransientDependency
protected IServiceScopeFactory ServiceScopeFactory { get; }
protected PackageVersionCheckerService PackageVersionCheckerService { get; }
public ICmdHelper CmdHelper { get; }
protected CliVersionService CliVersionService { get; }
public CliService(
ICommandLineArgumentParser commandLineArgumentParser,
@ -36,7 +37,8 @@ public class CliService : ITransientDependency
IServiceScopeFactory serviceScopeFactory,
PackageVersionCheckerService nugetService,
ICmdHelper cmdHelper,
MemoryService memoryService)
MemoryService memoryService,
CliVersionService cliVersionService)
{
_memoryService = memoryService;
CommandLineArgumentParser = commandLineArgumentParser;
@ -44,13 +46,14 @@ public class CliService : ITransientDependency
ServiceScopeFactory = serviceScopeFactory;
PackageVersionCheckerService = nugetService;
CmdHelper = cmdHelper;
CliVersionService = cliVersionService;
Logger = NullLogger<CliService>.Instance;
}
public async Task RunAsync(string[] args)
{
var currentCliVersion = await GetCurrentCliVersionInternalAsync(typeof(CliService).Assembly);
var currentCliVersion = await CliVersionService.GetCurrentCliVersionAsync();
Logger.LogInformation($"ABP CLI {currentCliVersion}");
var commandLineArgs = CommandLineArgumentParser.Parse(args);
@ -248,41 +251,6 @@ public class CliService : ITransientDependency
return assembly.Location.Substring(0, assembly.Location.IndexOf(".store", StringComparison.Ordinal));
}
public async Task<SemanticVersion> GetCurrentCliVersionAsync(Assembly assembly)
{
return await GetCurrentCliVersionInternalAsync(assembly);
}
private async Task<SemanticVersion> GetCurrentCliVersionInternalAsync(Assembly assembly)
{
SemanticVersion currentCliVersion = default;
var consoleOutput = new StringReader(CmdHelper.RunCmdAndGetOutput($"dotnet tool list -g", out int exitCode));
string line;
while ((line = await consoleOutput.ReadLineAsync()) != null)
{
if (line.StartsWith("volo.abp.cli", StringComparison.InvariantCultureIgnoreCase))
{
var version = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)[1];
SemanticVersion.TryParse(version, out currentCliVersion);
break;
}
}
if (currentCliVersion == null)
{
// If not a tool executable, fallback to assembly version and treat as dev without updates
// Assembly revisions are not supported by SemVer scheme required for NuGet, trim to {major}.{minor}.{patch}
var assemblyVersion = string.Join(".", assembly.GetFileVersion().Split('.').Take(3));
return SemanticVersion.Parse(assemblyVersion + "-dev");
}
return currentCliVersion;
}
private UpdateChannel GetUpdateChannel(SemanticVersion currentCliVersion)
{
if (!currentCliVersion.IsPrerelease)
@ -332,12 +300,12 @@ public class CliService : ITransientDependency
var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}";
Logger.LogWarning($"A newer {updateChannel.ToString().ToLowerInvariant()} version of the ABP CLI is available: {latestVersion}.");
if (!string.IsNullOrWhiteSpace(message))
{
Logger.LogWarning(message);
}
Logger.LogWarning(string.Empty);
Logger.LogWarning("Update Command: ");

69
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

@ -12,6 +12,7 @@ using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.GitHub;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
@ -19,6 +20,7 @@ using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.ProjectBuilding.Templates.Maui;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
using Volo.Abp.IO;
@ -37,18 +39,21 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency
protected ICancellationTokenProvider CancellationTokenProvider { get; }
private readonly CliHttpClientFactory _cliHttpClientFactory;
protected CliVersionService CliVersionService { get; }
public AbpIoSourceCodeStore(
IOptions<AbpCliOptions> options,
IJsonSerializer jsonSerializer,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
ICancellationTokenProvider cancellationTokenProvider,
CliHttpClientFactory cliHttpClientFactory)
CliHttpClientFactory cliHttpClientFactory,
CliVersionService cliVersionService)
{
JsonSerializer = jsonSerializer;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
CancellationTokenProvider = cancellationTokenProvider;
_cliHttpClientFactory = cliHttpClientFactory;
CliVersionService = cliVersionService;
Options = options.Value;
Logger = NullLogger<AbpIoSourceCodeStore>.Instance;
@ -63,8 +68,8 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency
bool skipCache = false)
{
DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache);
var userSpecifiedVersion = version != null;
var latestVersion = version ?? await GetLatestSourceCodeVersionAsync(name, type, null, includePreReleases);
if (version == null)
{
if (latestVersion == null)
@ -86,14 +91,68 @@ public class AbpIoSourceCodeStore : ISourceCodeStore, ITransientDependency
version = latestVersion;
}
else
var currentCliVersion = await CliVersionService.GetCurrentCliVersionAsync();
var templateVersion = SemanticVersion.Parse(version);
var outputWarning = false;
if (currentCliVersion.Major != templateVersion.Major || currentCliVersion.Minor != templateVersion.Minor)
{
// major and minor version are different
outputWarning = true;
}
else if (currentCliVersion.Major == templateVersion.Major &&
currentCliVersion.Minor == templateVersion.Minor &&
currentCliVersion.Patch < templateVersion.Patch)
{
if (!await IsVersionExists(name, version))
// major and minor version are same but patch version is lower
outputWarning = true;
}
else if(currentCliVersion.Major == templateVersion.Major &&
currentCliVersion.Minor == templateVersion.Minor &&
currentCliVersion.Patch == templateVersion.Patch &&
currentCliVersion.IsPrerelease && templateVersion.IsPrerelease)
{
// major and minor and patch version are same but prerelease version may be lower
var cliRcVersion = currentCliVersion.ReleaseLabels.LastOrDefault();
var templateRcVersion = templateVersion.ReleaseLabels.LastOrDefault();
if (cliRcVersion != null && templateRcVersion != null)
{
throw new Exception("There is no version found with given version: " + version);
if (int.TryParse(cliRcVersion, out var cliRcVersionNumber) && int.TryParse(templateRcVersion, out var templateRcVersionNumber))
{
if (cliRcVersionNumber < templateRcVersionNumber)
{
outputWarning = true;
}
}
}
}
if (outputWarning)
{
version = currentCliVersion.ToString();
Logger.LogWarning(userSpecifiedVersion
? $"The specified template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues."
: $"The latest template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues.");
Logger.LogWarning("Please upgrade/downgrade the CLI version to the template version.");
Logger.LogWarning($"> dotnet tool uninstall -g volo.abp.cli");
Logger.LogWarning(!templateVersion.IsPrerelease
? $"> dotnet tool install -g volo.abp.cli --version \"{templateVersion.Major}.{templateVersion.Minor}.*\""
: $"> dotnet tool install -g volo.abp.cli --version {templateVersion}");
if (!userSpecifiedVersion)
{
version = currentCliVersion.ToString();
Logger.LogWarning($"We have changed the template version as the cli version.");
Logger.LogWarning($"New version: {version}");
}
}
if (!await IsVersionExists(name, version))
{
throw new Exception("There is no version found with given version: " + version);
}
var nugetVersion = (await GetTemplateNugetVersionAsync(name, type, version)) ?? version;
if (!string.IsNullOrWhiteSpace(templateSource) && !IsNetworkSource(templateSource))

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs

@ -7,6 +7,7 @@ using NuGet.Versioning;
using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
@ -16,18 +17,18 @@ public class AngularServiceProxyGenerator : ServiceProxyGeneratorBase<AngularSer
{
public const string Name = "NG";
private readonly CliService _cliService;
private readonly CliVersionService _cliVersionService;
private readonly ICmdHelper _cmdhelper;
public AngularServiceProxyGenerator(
CliHttpClientFactory cliHttpClientFactory,
IJsonSerializer jsonSerializer,
ICmdHelper cmdhelper,
CliService cliService) :
CliVersionService cliVersionService) :
base(cliHttpClientFactory, jsonSerializer)
{
_cmdhelper = cmdhelper;
_cliService = cliService;
_cliVersionService = cliVersionService;
}
public async override Task GenerateProxyAsync(GenerateProxyArgs args)
@ -123,7 +124,7 @@ public class AngularServiceProxyGenerator : ServiceProxyGeneratorBase<AngularSer
return;
}
var cliVersion = await _cliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly);
var cliVersion = await _cliVersionService.GetCurrentCliVersionAsync();
if (semanticSchematicsVersion < cliVersion)
{
Logger.LogWarning("\"@abp/ng.schematics\" version is lower than ABP Cli version.");

49
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

@ -0,0 +1,49 @@
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Version;
public class CliVersionService : ITransientDependency
{
private CmdHelper CmdHelper { get; }
public CliVersionService(CmdHelper cmdHelper)
{
CmdHelper = cmdHelper;
}
public async Task<SemanticVersion> GetCurrentCliVersionAsync()
{
SemanticVersion currentCliVersion = default;
var consoleOutput = new StringReader(CmdHelper.RunCmdAndGetOutput($"dotnet tool list -g", out int exitCode));
string line;
while ((line = await consoleOutput.ReadLineAsync()) != null)
{
if (line.StartsWith("volo.abp.cli", StringComparison.InvariantCultureIgnoreCase))
{
var version = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)[1];
SemanticVersion.TryParse(version, out currentCliVersion);
break;
}
}
if (currentCliVersion == null)
{
// If not a tool executable, fallback to assembly version and treat as dev without updates
// Assembly revisions are not supported by SemVer scheme required for NuGet, trim to {major}.{minor}.{patch}
var assemblyVersion = string.Join(".", Assembly.GetExecutingAssembly().GetFileVersion().Split('.').Take(3));
return SemanticVersion.Parse(assemblyVersion + "-dev");
}
return currentCliVersion;
}
}
Loading…
Cancel
Save