[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 import time
from io import StringIO from io import StringIO
from subprocess import PIPE from subprocess import PIPE
from typing import List, Tuple from typing import List, Tuple, Set
# default environment variables for subprocesses. # default environment variables for subprocesses.
from bauh.api.abstract.handler import ProcessWatcher 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')) 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 = {} res = {}
if lang: if lang:
@@ -36,6 +36,9 @@ def gen_env(global_interpreter: bool, lang: str = DEFAULT_LANG) -> dict:
else: else:
res['PATH'] = PATH res['PATH'] = PATH
if extra_paths:
res['PATH'] += ':' + ':'.join(extra_paths)
return res return res
@@ -60,8 +63,9 @@ class SystemProcess:
class SimpleProcess: class SimpleProcess:
def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None, global_interpreter: bool = USE_GLOBAL_INTERPRETER, def __init__(self, cmd: List[str], cwd: str = '.', expected_code: int = None,
lang: str = DEFAULT_LANG, root_password: str = None): global_interpreter: bool = USE_GLOBAL_INTERPRETER, lang: str = DEFAULT_LANG, root_password: str = None,
extra_paths: Set[str] = None):
pwdin, final_cmd = None, [] pwdin, final_cmd = None, []
if root_password is not None: if root_password is not None:
@@ -70,17 +74,17 @@ class SimpleProcess:
final_cmd.extend(cmd) 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 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 = { args = {
"stdout": subprocess.PIPE, "stdout": subprocess.PIPE,
"stderr": subprocess.STDOUT, "stderr": subprocess.STDOUT,
"bufsize": -1, "bufsize": -1,
"cwd": cwd, "cwd": cwd,
"env": gen_env(global_interpreter, lang) "env": gen_env(global_interpreter, lang, extra_paths=extra_paths)
} }
if stdin: 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, 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 runs a given command and returns its default output
:param cmd: :param cmd:
@@ -179,7 +183,7 @@ def run_cmd(cmd: str, expected_code: int = 0, ignore_return_code: bool = False,
args = { args = {
"shell": True, "shell": True,
"stdout": PIPE, "stdout": PIPE,
"env": gen_env(global_interpreter), "env": gen_env(global_interpreter, extra_paths=extra_paths),
'cwd': cwd '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) BIN_PATH = '{}/.local/share/bauh/web'.format(HOME_PATH)
INSTALLED_PATH = '{}/installed'.format(BIN_PATH) INSTALLED_PATH = '{}/installed'.format(BIN_PATH)
NODE_DIR_PATH = '{}/node'.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) NODE_BIN_PATH = '{}/bin/node'.format(NODE_DIR_PATH)
NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH) NPM_BIN_PATH = '{}/bin/npm'.format(NODE_DIR_PATH)
NODE_MODULES_PATH = '{}/node_modules'.format(BIN_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 import system
from bauh.commons.html import bold from bauh.commons.html import bold
from bauh.commons.system import SimpleProcess, ProcessHandler, run_cmd 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, \ 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 ELECTRON_PATH, ELECTRON_DOWNLOAD_URL, ELECTRON_SHA256_URL, URL_ENVIRONMENT_SETTINGS, NPM_BIN_PATH, NODE_PATHS
from bauh.view.util.translation import I18n from bauh.view.util.translation import I18n
@@ -92,10 +92,15 @@ class EnvironmentUpdater:
if handler and handler.watcher: if handler and handler.watcher:
handler.watcher.change_substatus(self.i18n['web.environment.install'].format(bold('nativefier'))) 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: 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: else:
proc.instance.wait() proc.instance.wait()
@@ -104,6 +109,10 @@ class EnvironmentUpdater:
return True return True
else: else:
self.logger.error("Could not install nativefier {}".format(version)) self.logger.error("Could not install nativefier {}".format(version))
for err in proc.instance.stdout:
if err:
print(err.decode())
return False return False
def _is_nativefier_installed(self) -> bool: def _is_nativefier_installed(self) -> bool:
@@ -125,7 +134,7 @@ class EnvironmentUpdater:
if not self._is_nativefier_installed(): if not self._is_nativefier_installed():
return self._install_nativefier(version=version, handler=handler) 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: if installed_version:
installed_version = installed_version.strip() installed_version = installed_version.strip()

View File

@@ -1,7 +1,7 @@
from typing import List from typing import List
from bauh.commons.system import SimpleProcess 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: 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: if extra_options:
cmd.extend(extra_options) cmd.extend(extra_options)
return SimpleProcess(cmd, cwd=cwd) return SimpleProcess(cmd, cwd=cwd, extra_paths=NODE_PATHS)