[wgem] really working without node and npm installed

This commit is contained in:
Vinícius Moreira
2019-12-13 18:58:35 -03:00
parent 217a9d5ec9
commit cdff6696eb
4 changed files with 30 additions and 16 deletions

View File

@@ -4,7 +4,7 @@ import sys
import time
from io import StringIO
from subprocess import PIPE
from typing import List, Tuple
from typing import List, Tuple, Set
# default environment variables for subprocesses.
from bauh.api.abstract.handler import ProcessWatcher
@@ -25,7 +25,7 @@ USE_GLOBAL_INTERPRETER = bool(os.getenv('VIRTUAL_ENV'))
SIZE_MULTIPLIERS = ((0.001, 'Kb'), (0.000001, 'Mb'), (0.000000001, 'Gb'), (0.000000000001, 'Tb'))
def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG) -> dict:
def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG, extra_paths: Set[str] = None) -> dict:
res = {}
if lang:
@@ -36,6 +36,9 @@ def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG) -> dict:
else:
res['PATH'] = PATH
if extra_paths:
res['PATH'] += ':' + ':'.join(extra_paths)
return res
@@ -60,8 +63,9 @@ class SystemProcess:
class SimpleProcess:
def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None, global_interpreter: bool = USE_GLOBAL_INTERPRETER,
lang: str = DEFAULT_LANG, root_password: str = None):
def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None,
global_interpreter: bool = USE_GLOBAL_INTERPRETER, lang: str = DEFAULT_LANG, root_password: str = None,
extra_paths: Set[str] = None):
pwdin, final_cmd = None, []
if root_password is not None:
@@ -70,17 +74,17 @@ class SimpleProcess:
final_cmd.extend(cmd)
self.instance = self._new(final_cmd, cwd, global_interpreter, lang, stdin=pwdin)
self.instance = self._new(final_cmd, cwd, global_interpreter, lang, stdin=pwdin, extra_paths=extra_paths)
self.expected_code = expected_code
def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None) -> subprocess.Popen:
def _new(self, cmd: List[str], cwd: str, global_interpreter: bool, lang: str, stdin = None, extra_paths: Set[str] = None) -> subprocess.Popen:
args = {
"stdout": subprocess.PIPE,
"stderr": subprocess.STDOUT,
"bufsize": -1,
"cwd": cwd,
"env": gen_env(global_interpreter, lang)
"env": gen_env(global_interpreter, lang, extra_paths=extra_paths)
}
if stdin:
@@ -166,7 +170,7 @@ class ProcessHandler:
def run_cmd(cmd: str, expected_code: int = 0, ignore_return_code: bool = False, print_error: bool = True,
cwd: str = '.', global_interpreter: bool = USE_GLOBAL_INTERPRETER) -> str:
cwd: str = '.', global_interpreter: bool = USE_GLOBAL_INTERPRETER, extra_paths: Set[str] = None) -> str:
"""
runs a given command and returns its default output
:param cmd:
@@ -179,7 +183,7 @@ def run_cmd(cmd: str, expected_code: int = 0, ignore_return_code: bool = False,
args = {
"shell": True,
"stdout": PIPE,
"env": gen_env(global_interpreter),
"env": gen_env(global_interpreter, extra_paths=extra_paths),
'cwd': cwd
}

View File

@@ -6,6 +6,7 @@ ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
BIN_PATH = '{}/.local/share/bauh/web'.format(HOME_PATH)
INSTALLED_PATH = '{}/installed'.format(BIN_PATH)
NODE_DIR_PATH = '{}/node'.format(BIN_PATH)
NODE_PATHS = {NODE_DIR_PATH + '/bin'}
NODE_BIN_PATH = '{}/bin/node'.format(NODE_DIR_PATH)
NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH)
NODE_MODULES_PATH = '{}/node_modules'.format(BIN_PATH)

View File

@@ -13,8 +13,8 @@ from bauh.api.http import HttpClient
from bauh.commons import system
from bauh.commons.html import bold
from bauh.commons.system import SimpleProcess, ProcessHandler, run_cmd
from bauh.gems.web import BIN_PATH, NODE_DIR_PATH, NODE_BIN_PATH, NPM_BIN_PATH, NODE_MODULES_PATH, NATIVEFIER_BIN_PATH, \
ELECTRON_PATH, ELECTRON_DOWNLOAD_URL, ELECTRON_SHA256_URL, URL_ENVIRONMENT_SETTINGS
from bauh.gems.web import BIN_PATH, NODE_DIR_PATH, NODE_BIN_PATH, NODE_MODULES_PATH, NATIVEFIER_BIN_PATH, \
ELECTRON_PATH, ELECTRON_DOWNLOAD_URL, ELECTRON_SHA256_URL, URL_ENVIRONMENT_SETTINGS, NPM_BIN_PATH, NODE_PATHS
from bauh.view.util.translation import I18n
@@ -92,10 +92,15 @@ class EnvironmentUpdater:
if handler and handler.watcher:
handler.watcher.change_substatus(self.i18n['web.environment.install'].format(bold('nativefier')))
proc = SimpleProcess([NPM_BIN_PATH, 'install', 'nativefier@{}'.format(version)], cwd=BIN_PATH)
proc = SimpleProcess([NPM_BIN_PATH, 'install', 'nativefier@{}'.format(version)], cwd=BIN_PATH, extra_paths=NODE_PATHS)
if handler:
return handler.handle_simple(proc)[0]
installed = handler.handle_simple(proc)[0]
if installed:
self.logger.info("nativifier {} successfully installed".format(version))
return installed
else:
proc.instance.wait()
@@ -104,6 +109,10 @@ class EnvironmentUpdater:
return True
else:
self.logger.error("Could not install nativefier {}".format(version))
for err in proc.instance.stdout:
if err:
print(err.decode())
return False
def _is_nativefier_installed(self) -> bool:
@@ -125,7 +134,7 @@ class EnvironmentUpdater:
if not self._is_nativefier_installed():
return self._install_nativefier(version=version, handler=handler)
installed_version = run_cmd('{} --version'.format(NATIVEFIER_BIN_PATH), print_error=False)
installed_version = run_cmd('{} --version'.format(NATIVEFIER_BIN_PATH), print_error=False, extra_paths=NODE_PATHS)
if installed_version:
installed_version = installed_version.strip()

View File

@@ -1,7 +1,7 @@
from typing import List
from bauh.commons.system import SimpleProcess
from bauh.gems.web import NATIVEFIER_BIN_PATH
from bauh.gems.web import NATIVEFIER_BIN_PATH, NODE_PATHS
def install(url: str, name: str, output_dir: str, electron_version: str, cwd: str, extra_options: List[str] = None) -> SimpleProcess:
@@ -10,4 +10,4 @@ def install(url: str, name: str, output_dir: str, electron_version: str, cwd: st
if extra_options:
cmd.extend(extra_options)
return SimpleProcess(cmd, cwd=cwd)
return SimpleProcess(cmd, cwd=cwd, extra_paths=NODE_PATHS)