in contrib/node/src/python/pants/contrib/node/subsystems/resolvers/npm_resolver.py [0:0]
def resolve_target(self, node_task, target, results_dir, node_paths, resolve_locally=False,
install_optional=None, production_only=None, force=None, frozen_lockfile=None,
**kwargs):
"""Installs the node_package target in the results directory copying sources if necessary.
:param Task node_task: The task executing this method.
:param Target target: The target being resolve.
:param String results_dir: The output location where this target will be resolved.
:param NodePaths node_paths: A mapping of targets and their resolved location, if resolved.
:param Boolean resolve_locally: If true, the sources do not have to be copied.
:param Boolean install_optional: If true, install optional dependencies.
:param Boolean force: If true, rebuild dependencies even if already built.
:param Boolean frozen_lockfile: Preserve lock file and fails if a change is detected.
"""
if self.get_options().force_option_override:
install_optional = self.get_options().install_optional
production_only = self.get_options().install_production
force = self.get_options().force
frozen_lockfile = self.get_options().frozen_lockfile
else:
install_optional = install_optional if install_optional is not None else self.get_options().install_optional
production_only = production_only if production_only is not None else self.get_options().install_production
force = force if force is not None else self.get_options().force
frozen_lockfile = frozen_lockfile if frozen_lockfile is not None else self.get_options().frozen_lockfile
if not resolve_locally:
self._copy_sources(target, results_dir)
with pushd(results_dir):
if not os.path.exists('package.json'):
raise TaskError(
'Cannot find package.json. Did you forget to put it in target sources?')
# TODO: remove/remodel the following section when node_module dependency is fleshed out.
package_manager = node_task.get_package_manager(target=target).name
if package_manager == PACKAGE_MANAGER_NPM:
if resolve_locally:
raise TaskError('Resolving node package modules locally is not supported for NPM.')
if os.path.exists('npm-shrinkwrap.json'):
node_task.context.log.info('Found npm-shrinkwrap.json, will not inject package.json')
else:
node_task.context.log.warn(
'Cannot find npm-shrinkwrap.json. Did you forget to put it in target sources? '
'This package will fall back to inject package.json with pants BUILD dependencies '
'including node_remote_module and other node dependencies. However, this is '
'not fully supported.')
self._emit_package_descriptor(node_task, target, results_dir, node_paths)
elif package_manager == PACKAGE_MANAGER_YARNPKG:
if not os.path.exists('yarn.lock') and frozen_lockfile:
raise TaskError(
'Cannot find yarn.lock. Did you forget to put it in target sources?')
# Install all dependencies except for `file:` dependencies
# `file:` dependencies are special dependencies that point to a local path to a pants node target
# `file:` dependencies are already in the build graph and should be already be installed by this point
# Copy the package.json and then remove the file: dependencies from package.json
# Run the install and symlink the file: dependencies using their node_paths
# Afterwards, restore the original package.json to not cause diff changes when resolve_locally=True
# The file mutation is occuring in place and the package.json may potentially not be restored here
# if the process is closed.
with safe_temp_edit('package.json') as package_json:
with open(package_json, 'r') as package_json_file:
json_data = json.load(package_json_file)
source_deps = { k : v for k,v in json_data.get('dependencies', {}).items() if self.parse_file_path(v)}
third_party_deps = { k : v for k,v in json_data.get('dependencies', {}).items() if not self.parse_file_path(v)}
json_data['dependencies'] = third_party_deps
# TODO(6489): Currently the file: dependencies need to be duplicated in BUILD.
# After this issue is closed, only dependencies need to be specified in package.json
for package_name, file_path in source_deps.items():
if self._get_target_from_package_name(target, package_name, file_path) is None:
raise TaskError('Local dependency in package.json not found in the build graph. '
'Check your BUILD file for missing dependencies. ["{}": {}]'.format(package_name, file_path))
mode = 'w' if PY3 else 'wb'
with open(package_json, mode) as package_json_file:
json.dump(json_data, package_json_file, indent=2, separators=(',', ': '))
result, command = node_task.install_module(
target=target, install_optional=install_optional,
production_only=production_only, force=force, frozen_lockfile=frozen_lockfile,
workunit_name=target.address.reference(),
workunit_labels=[WorkUnitLabel.COMPILER])
if result != 0:
raise TaskError('Failed to resolve dependencies for {}:\n\t{} failed with exit code {}'
.format(target.address.reference(), command, result))
if source_deps:
self._link_source_dependencies(node_task, target, results_dir, node_paths, source_deps)