Browse Source

Introduce `NpmHelper`.

pull/12938/head
maliming 4 years ago
parent
commit
ce08ea99be
No known key found for this signature in database GPG Key ID: 96224957E51C89E
  1. 50
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs
  2. 22
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmGlobalPackagesChecker.cs
  3. 25
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ThemePackageAdder.cs
  4. 69
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs

50
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/LIbs/InstallLibsService.cs

@ -25,18 +25,17 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
Path.Combine("obj", "debug") Path.Combine("obj", "debug")
}; };
public ICmdHelper CmdHelper { get; } public NpmHelper NpmHelper { get; }
public const string LibsDirectory = "./wwwroot/libs"; public const string LibsDirectory = "./wwwroot/libs";
public ILogger<InstallLibsService> Logger { get; set; } public ILogger<InstallLibsService> Logger { get; set; }
private readonly IJsonSerializer _jsonSerializer; private readonly IJsonSerializer _jsonSerializer;
public InstallLibsService(IJsonSerializer jsonSerializer, ICmdHelper cmdHelper) public InstallLibsService(IJsonSerializer jsonSerializer, NpmHelper npmHelper)
{ {
CmdHelper = cmdHelper; NpmHelper = npmHelper;
_jsonSerializer = jsonSerializer; _jsonSerializer = jsonSerializer;
Logger = NullLogger<InstallLibsService>.Instance;
} }
public async Task InstallLibsAsync(string directory) public async Task InstallLibsAsync(string directory)
@ -48,13 +47,13 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
return; return;
} }
if (!IsNpmInstalled()) if (!NpmHelper.IsNpmInstalled())
{ {
Logger.LogWarning("NPM is not installed, visit https://nodejs.org/en/download/ and install NPM"); Logger.LogWarning("NPM is not installed, visit https://nodejs.org/en/download/ and install NPM");
return; return;
} }
if (!IsYarnAvailable()) if (!NpmHelper.IsYarnAvailable())
{ {
Logger.LogWarning("YARN is not installed, which may cause package inconsistency, please use YARN instead of NPM. visit https://classic.yarnpkg.com/lang/en/docs/install/ and install YARN"); Logger.LogWarning("YARN is not installed, which may cause package inconsistency, please use YARN instead of NPM. visit https://classic.yarnpkg.com/lang/en/docs/install/ and install YARN");
} }
@ -72,13 +71,13 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
// angular // angular
if (projectPath.EndsWith("angular.json")) if (projectPath.EndsWith("angular.json"))
{ {
if (IsYarnAvailable()) if (NpmHelper.IsYarnAvailable())
{ {
RunYarn(projectDirectory); NpmHelper.RunYarn(projectDirectory);
} }
else else
{ {
RunNpmInstall(projectDirectory); NpmHelper.RunNpmInstall(projectDirectory);
} }
} }
@ -92,13 +91,13 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
continue; continue;
} }
if (IsYarnAvailable()) if (NpmHelper.IsYarnAvailable())
{ {
RunYarn(projectDirectory); NpmHelper.RunYarn(projectDirectory);
} }
else else
{ {
RunNpmInstall(projectDirectory); NpmHelper.RunNpmInstall(projectDirectory);
} }
await CleanAndCopyResources(projectDirectory); await CleanAndCopyResources(projectDirectory);
@ -244,31 +243,4 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
return pattern; return pattern;
} }
private void RunNpmInstall(string directory)
{
Logger.LogInformation($"Running npm install on {directory}");
CmdHelper.RunCmd($"npm install", directory);
}
private void RunYarn(string directory)
{
Logger.LogInformation($"Running Yarn on {directory}");
CmdHelper.RunCmd($"yarn", directory);
}
private bool IsNpmInstalled()
{
var output = CmdHelper.RunCmdAndGetOutput("npm -v").Trim();
return SemanticVersion.TryParse(output, out _);
}
private bool IsYarnAvailable()
{
var output = CmdHelper.RunCmdAndGetOutput("yarn -v").Trim();
if (!SemanticVersion.TryParse(output, out var version)){
return false;
}
return version > SemanticVersion.Parse("1.20.0");
}
} }

22
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmGlobalPackagesChecker.cs

@ -7,34 +7,22 @@ namespace Volo.Abp.Cli.ProjectModification;
public class NpmGlobalPackagesChecker : ITransientDependency public class NpmGlobalPackagesChecker : ITransientDependency
{ {
public ICmdHelper CmdHelper { get; } public NpmHelper NpmHelper { get; }
public ILogger<NpmGlobalPackagesChecker> Logger { get; set; } public ILogger<NpmGlobalPackagesChecker> Logger { get; set; }
public NpmGlobalPackagesChecker(ICmdHelper cmdHelper) public NpmGlobalPackagesChecker(NpmHelper npmHelper)
{ {
CmdHelper = cmdHelper; NpmHelper = npmHelper;
Logger = NullLogger<NpmGlobalPackagesChecker>.Instance; Logger = NullLogger<NpmGlobalPackagesChecker>.Instance;
} }
public void Check() public void Check()
{ {
var installedNpmPackages = GetInstalledNpmPackages(); var installedNpmPackages = NpmHelper.GetInstalledNpmPackages();
if (!installedNpmPackages.Contains(" yarn@")) if (!installedNpmPackages.Contains(" yarn@"))
{ {
InstallYarn(); NpmHelper.InstallYarn();
} }
} }
protected virtual string GetInstalledNpmPackages()
{
Logger.LogInformation("Checking installed npm global packages...");
return CmdHelper.RunCmdAndGetOutput("npm list -g --depth 0 --silent", out int exitCode);
}
protected virtual void InstallYarn()
{
Logger.LogInformation("Installing yarn...");
CmdHelper.RunCmd("npm install yarn -g");
}
} }

25
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ThemePackageAdder.cs

@ -10,12 +10,12 @@ namespace Volo.Abp.Cli.ProjectModification;
public class ThemePackageAdder : ITransientDependency public class ThemePackageAdder : ITransientDependency
{ {
protected ICmdHelper CmdHelper { get; } protected NpmHelper NpmHelper { get; }
protected PackageJsonFileFinder PackageJsonFileFinder { get; } protected PackageJsonFileFinder PackageJsonFileFinder { get; }
public ThemePackageAdder(ICmdHelper cmdHelper, PackageJsonFileFinder packageJsonFileFinder) public ThemePackageAdder(NpmHelper npmHelper, PackageJsonFileFinder packageJsonFileFinder)
{ {
CmdHelper = cmdHelper; NpmHelper = npmHelper;
PackageJsonFileFinder = packageJsonFileFinder; PackageJsonFileFinder = packageJsonFileFinder;
} }
@ -44,19 +44,18 @@ public class ThemePackageAdder : ITransientDependency
return; return;
} }
var installCommand = IsYarnAvailable() ? "yarn add " : "npm install "; var yarnAvailable = NpmHelper.IsYarnAvailable();
var packageVersion = !string.IsNullOrWhiteSpace(version) ? $"@{version}" : string.Empty;
foreach (var packageJsonFilePath in packageJsonFilePaths) foreach (var packageJsonFilePath in packageJsonFilePaths)
{ {
var directory = Path.GetDirectoryName(packageJsonFilePath).EnsureEndsWith(Path.DirectorySeparatorChar); var directory = Path.GetDirectoryName(packageJsonFilePath).EnsureEndsWith(Path.DirectorySeparatorChar);
CmdHelper.RunCmd(installCommand + package + packageVersion, workingDirectory: directory); if (yarnAvailable)
{
NpmHelper.YarnAddPackage(package, version, directory);
}
else
{
NpmHelper.NpmInstallPackage(package, version, directory);
}
} }
} }
private bool IsYarnAvailable()
{
var output = CmdHelper.RunCmdAndGetOutput("yarn -v").Trim();
return SemanticVersion.TryParse(output, out _);
}
} }

69
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/NpmHelper.cs

@ -0,0 +1,69 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using NuGet.Versioning;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.Utils;
public class NpmHelper : ITransientDependency
{
protected ICmdHelper CmdHelper { get; }
public ILogger<NpmHelper> Logger { get; set; }
public NpmHelper(ICmdHelper cmdHelper)
{
CmdHelper = cmdHelper;
Logger = NullLogger<NpmHelper>.Instance;
}
public bool IsNpmInstalled()
{
var output = CmdHelper.RunCmdAndGetOutput("npm -v").Trim();
return SemanticVersion.TryParse(output, out _);
}
public bool IsYarnAvailable()
{
var output = CmdHelper.RunCmdAndGetOutput("yarn -v").Trim();
if (!SemanticVersion.TryParse(output, out var version)){
return false;
}
return version > SemanticVersion.Parse("1.20.0");
}
public void RunNpmInstall(string directory)
{
Logger.LogInformation($"Running npm install on {directory}");
CmdHelper.RunCmd($"npm install", directory);
}
public void RunYarn(string directory)
{
Logger.LogInformation($"Running Yarn on {directory}");
CmdHelper.RunCmd($"yarn", directory);
}
public void NpmInstallPackage(string package, string version, string directory)
{
var packageVersion = !string.IsNullOrWhiteSpace(version) ? $"@{version}" : string.Empty;
CmdHelper.RunCmd("npm install " + package + packageVersion, workingDirectory: directory);
}
public void YarnAddPackage(string package, string version, string directory)
{
var packageVersion = !string.IsNullOrWhiteSpace(version) ? $"@{version}" : string.Empty;
CmdHelper.RunCmd("yarn add " + package + packageVersion, workingDirectory: directory);
}
public string GetInstalledNpmPackages()
{
Logger.LogInformation("Checking installed npm global packages...");
return CmdHelper.RunCmdAndGetOutput("npm list -g --depth 0 --silent", out int exitCode);
}
public void InstallYarn()
{
Logger.LogInformation("Installing yarn...");
CmdHelper.RunCmd("npm install yarn -g");
}
}
Loading…
Cancel
Save