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. 54
      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. 29
      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

54
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);
} }
} }
@ -86,19 +85,19 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
if (projectPath.EndsWith(".csproj")) if (projectPath.EndsWith(".csproj"))
{ {
var packageJsonFilePath = Path.Combine(Path.GetDirectoryName(projectPath), "package.json"); var packageJsonFilePath = Path.Combine(Path.GetDirectoryName(projectPath), "package.json");
if (!File.Exists(packageJsonFilePath)) if (!File.Exists(packageJsonFilePath))
{ {
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");
}
} }

29
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;
} }
@ -24,7 +24,7 @@ public class ThemePackageAdder : ITransientDependency
var packageJsonFilePaths = PackageJsonFileFinder.Find(rootDirectory) var packageJsonFilePaths = PackageJsonFileFinder.Find(rootDirectory)
.Where(x => !File.Exists(x.RemovePostFix("package.json") + "angular.json")) .Where(x => !File.Exists(x.RemovePostFix("package.json") + "angular.json"))
.ToList(); .ToList();
AddPackage(packageJsonFilePaths, package, version); AddPackage(packageJsonFilePaths, package, version);
} }
@ -43,20 +43,19 @@ public class ThemePackageAdder : ITransientDependency
{ {
return; return;
} }
var installCommand = IsYarnAvailable() ? "yarn add " : "npm install ";
var packageVersion = !string.IsNullOrWhiteSpace(version) ? $"@{version}" : string.Empty;
var yarnAvailable = NpmHelper.IsYarnAvailable();
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