Introduce `NpmHelper`.

pull/12938/head
maliming 3 years ago
parent 423a211b23
commit ce08ea99be
No known key found for this signature in database
GPG Key ID: 096224957E51C89E

@ -25,18 +25,17 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
Path.Combine("obj", "debug")
};
public ICmdHelper CmdHelper { get; }
public NpmHelper NpmHelper { get; }
public const string LibsDirectory = "./wwwroot/libs";
public ILogger<InstallLibsService> Logger { get; set; }
private readonly IJsonSerializer _jsonSerializer;
public InstallLibsService(IJsonSerializer jsonSerializer, ICmdHelper cmdHelper)
public InstallLibsService(IJsonSerializer jsonSerializer, NpmHelper npmHelper)
{
CmdHelper = cmdHelper;
NpmHelper = npmHelper;
_jsonSerializer = jsonSerializer;
Logger = NullLogger<InstallLibsService>.Instance;
}
public async Task InstallLibsAsync(string directory)
@ -48,13 +47,13 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
return;
}
if (!IsNpmInstalled())
if (!NpmHelper.IsNpmInstalled())
{
Logger.LogWarning("NPM is not installed, visit https://nodejs.org/en/download/ and install NPM");
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");
}
@ -72,13 +71,13 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
// angular
if (projectPath.EndsWith("angular.json"))
{
if (IsYarnAvailable())
if (NpmHelper.IsYarnAvailable())
{
RunYarn(projectDirectory);
NpmHelper.RunYarn(projectDirectory);
}
else
{
RunNpmInstall(projectDirectory);
NpmHelper.RunNpmInstall(projectDirectory);
}
}
@ -86,19 +85,19 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
if (projectPath.EndsWith(".csproj"))
{
var packageJsonFilePath = Path.Combine(Path.GetDirectoryName(projectPath), "package.json");
if (!File.Exists(packageJsonFilePath))
{
continue;
}
if (IsYarnAvailable())
if (NpmHelper.IsYarnAvailable())
{
RunYarn(projectDirectory);
NpmHelper.RunYarn(projectDirectory);
}
else
{
RunNpmInstall(projectDirectory);
NpmHelper.RunNpmInstall(projectDirectory);
}
await CleanAndCopyResources(projectDirectory);
@ -244,31 +243,4 @@ public class InstallLibsService : IInstallLibsService, ITransientDependency
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");
}
}

@ -7,34 +7,22 @@ namespace Volo.Abp.Cli.ProjectModification;
public class NpmGlobalPackagesChecker : ITransientDependency
{
public ICmdHelper CmdHelper { get; }
public NpmHelper NpmHelper { get; }
public ILogger<NpmGlobalPackagesChecker> Logger { get; set; }
public NpmGlobalPackagesChecker(ICmdHelper cmdHelper)
public NpmGlobalPackagesChecker(NpmHelper npmHelper)
{
CmdHelper = cmdHelper;
NpmHelper = npmHelper;
Logger = NullLogger<NpmGlobalPackagesChecker>.Instance;
}
public void Check()
{
var installedNpmPackages = GetInstalledNpmPackages();
var installedNpmPackages = NpmHelper.GetInstalledNpmPackages();
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");
}
}

@ -10,12 +10,12 @@ namespace Volo.Abp.Cli.ProjectModification;
public class ThemePackageAdder : ITransientDependency
{
protected ICmdHelper CmdHelper { get; }
protected NpmHelper NpmHelper { get; }
protected PackageJsonFileFinder PackageJsonFileFinder { get; }
public ThemePackageAdder(ICmdHelper cmdHelper, PackageJsonFileFinder packageJsonFileFinder)
public ThemePackageAdder(NpmHelper npmHelper, PackageJsonFileFinder packageJsonFileFinder)
{
CmdHelper = cmdHelper;
NpmHelper = npmHelper;
PackageJsonFileFinder = packageJsonFileFinder;
}
@ -24,7 +24,7 @@ public class ThemePackageAdder : ITransientDependency
var packageJsonFilePaths = PackageJsonFileFinder.Find(rootDirectory)
.Where(x => !File.Exists(x.RemovePostFix("package.json") + "angular.json"))
.ToList();
AddPackage(packageJsonFilePaths, package, version);
}
@ -43,20 +43,19 @@ public class ThemePackageAdder : ITransientDependency
{
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)
{
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 _);
}
}
}

@ -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