recipetool: create: properly handle npm optional dependencies
npm's package.json supports two types of dependencies - optionalDependencies and dependencies; in the code for creating a recipe from a non-npm source (e.g. a git repository) we were not handling optionalDependencies and thus when pointed at a node.js application outside of npm we weren't taking care of all dependencies. (From OE-Core rev: 2b66cb9982d10ce1744d430858eaef3e5a72c8c0) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
21ace8b620
commit
6ac9c605e6
|
@ -83,7 +83,7 @@ class NpmRecipeHandler(RecipeHandler):
|
||||||
extravalues['extrafiles']['lockdown.json'] = tmpfile
|
extravalues['extrafiles']['lockdown.json'] = tmpfile
|
||||||
lines_before.append('NPM_LOCKDOWN := "${THISDIR}/${PN}/lockdown.json"')
|
lines_before.append('NPM_LOCKDOWN := "${THISDIR}/${PN}/lockdown.json"')
|
||||||
|
|
||||||
def _handle_dependencies(self, d, deps, lines_before, srctree):
|
def _handle_dependencies(self, d, deps, optdeps, lines_before, srctree):
|
||||||
import scriptutils
|
import scriptutils
|
||||||
# If this isn't a single module we need to get the dependencies
|
# If this isn't a single module we need to get the dependencies
|
||||||
# and add them to SRC_URI
|
# and add them to SRC_URI
|
||||||
|
@ -92,8 +92,17 @@ class NpmRecipeHandler(RecipeHandler):
|
||||||
if not origvalue.startswith('npm://'):
|
if not origvalue.startswith('npm://'):
|
||||||
src_uri = origvalue.split()
|
src_uri = origvalue.split()
|
||||||
changed = False
|
changed = False
|
||||||
for dep, depdata in deps.items():
|
deplist = {}
|
||||||
version = self.get_node_version(dep, depdata, d)
|
for dep, depver in optdeps.items():
|
||||||
|
depdata = self.get_npm_data(dep, depver, d)
|
||||||
|
if self.check_npm_optional_dependency(depdata):
|
||||||
|
deplist[dep] = depdata
|
||||||
|
for dep, depver in deps.items():
|
||||||
|
depdata = self.get_npm_data(dep, depver, d)
|
||||||
|
deplist[dep] = depdata
|
||||||
|
|
||||||
|
for dep, depdata in deplist.items():
|
||||||
|
version = depdata.get('version', None)
|
||||||
if version:
|
if version:
|
||||||
url = 'npm://registry.npmjs.org;name=%s;version=%s;subdir=node_modules/%s' % (dep, version, dep)
|
url = 'npm://registry.npmjs.org;name=%s;version=%s;subdir=node_modules/%s' % (dep, version, dep)
|
||||||
scriptutils.fetch_uri(d, url, srctree)
|
scriptutils.fetch_uri(d, url, srctree)
|
||||||
|
@ -170,8 +179,8 @@ class NpmRecipeHandler(RecipeHandler):
|
||||||
if 'homepage' in data:
|
if 'homepage' in data:
|
||||||
extravalues['HOMEPAGE'] = data['homepage']
|
extravalues['HOMEPAGE'] = data['homepage']
|
||||||
|
|
||||||
deps = data.get('dependencies', {})
|
deps, optdeps = self.get_npm_package_dependencies(data)
|
||||||
updated = self._handle_dependencies(tinfoil.config_data, deps, lines_before, srctree)
|
updated = self._handle_dependencies(tinfoil.config_data, deps, optdeps, lines_before, srctree)
|
||||||
if updated:
|
if updated:
|
||||||
# We need to redo the license stuff
|
# We need to redo the license stuff
|
||||||
self._replace_license_vars(srctree, lines_before, handled, extravalues, tinfoil.config_data)
|
self._replace_license_vars(srctree, lines_before, handled, extravalues, tinfoil.config_data)
|
||||||
|
@ -251,7 +260,7 @@ class NpmRecipeHandler(RecipeHandler):
|
||||||
|
|
||||||
# FIXME this is effectively duplicated from lib/bb/fetch2/npm.py
|
# FIXME this is effectively duplicated from lib/bb/fetch2/npm.py
|
||||||
# (split out from _getdependencies())
|
# (split out from _getdependencies())
|
||||||
def get_node_version(self, pkg, version, d):
|
def get_npm_data(self, pkg, version, d):
|
||||||
import bb.fetch2
|
import bb.fetch2
|
||||||
pkgfullname = pkg
|
pkgfullname = pkg
|
||||||
if version != '*' and not '/' in version:
|
if version != '*' and not '/' in version:
|
||||||
|
@ -261,7 +270,40 @@ class NpmRecipeHandler(RecipeHandler):
|
||||||
fetchcmd = "npm view %s --json" % pkgfullname
|
fetchcmd = "npm view %s --json" % pkgfullname
|
||||||
output, _ = bb.process.run(fetchcmd, stderr=subprocess.STDOUT, env=runenv, shell=True)
|
output, _ = bb.process.run(fetchcmd, stderr=subprocess.STDOUT, env=runenv, shell=True)
|
||||||
data = self._parse_view(output)
|
data = self._parse_view(output)
|
||||||
return data.get('version', None)
|
return data
|
||||||
|
|
||||||
|
# FIXME this is effectively duplicated from lib/bb/fetch2/npm.py
|
||||||
|
# (split out from _getdependencies())
|
||||||
|
def get_npm_package_dependencies(self, pdata):
|
||||||
|
dependencies = pdata.get('dependencies', {})
|
||||||
|
optionalDependencies = pdata.get('optionalDependencies', {})
|
||||||
|
dependencies.update(optionalDependencies)
|
||||||
|
depsfound = {}
|
||||||
|
optdepsfound = {}
|
||||||
|
for dep in dependencies:
|
||||||
|
if dep in optionalDependencies:
|
||||||
|
optdepsfound[dep] = dependencies[dep]
|
||||||
|
else:
|
||||||
|
depsfound[dep] = dependencies[dep]
|
||||||
|
return depsfound, optdepsfound
|
||||||
|
|
||||||
|
# FIXME this is effectively duplicated from lib/bb/fetch2/npm.py
|
||||||
|
# (split out from _getdependencies())
|
||||||
|
def check_npm_optional_dependency(self, pdata):
|
||||||
|
pkg_os = pdata.get('os', None)
|
||||||
|
if pkg_os:
|
||||||
|
if not isinstance(pkg_os, list):
|
||||||
|
pkg_os = [pkg_os]
|
||||||
|
blacklist = False
|
||||||
|
for item in pkg_os:
|
||||||
|
if item.startswith('!'):
|
||||||
|
blacklist = True
|
||||||
|
break
|
||||||
|
if (not blacklist and 'linux' not in pkg_os) or '!linux' in pkg_os:
|
||||||
|
logger.debug(2, "Skipping %s since it's incompatible with Linux" % pkg)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def register_recipe_handlers(handlers):
|
def register_recipe_handlers(handlers):
|
||||||
handlers.append((NpmRecipeHandler(), 60))
|
handlers.append((NpmRecipeHandler(), 60))
|
||||||
|
|
Loading…
Reference in New Issue