diff --git a/README.md b/README.md index 10cdbe39..1ca5965f 100644 --- a/README.md +++ b/README.md @@ -458,6 +458,7 @@ source_path = [ - `:zip [source] [destination]` is a special command which creates content of current working directory (first argument) and places it inside of path (second argument). - `pip_requirements` - Controls whether to execute `pip install`. Set to `false` to disable this feature, `true` to run `pip install` with `requirements.txt` found in `path`. Or set to another filename which you want to use instead. When `source_path` is passed as a string containing a path (and not a list of maps), and `requirements.txt` is present, `pip install` is automatically executed. - `pip_tmp_dir` - Set the base directory to make the temporary directory for pip installs. Can be useful for Docker in Docker builds. +- `pip_install_extra_args` - A list of additional pip arguments to add to the pip install command - `poetry_install` - Controls whether to execute `poetry export` and `pip install`. Set to `false` to disable this feature, `true` to run `poetry export` with `pyproject.toml` and `poetry.lock` found in `path`. When `source_path` is passed as a string containing a path (and not a list of maps), and `pyproject.toml` with a build system `poetry` is present, `poetry export` and `pip install` are automatically executed. - `poetry_export_extra_args` - A list of additional poetry arguments to add to the poetry export command - `npm_requirements` - Controls whether to execute `npm install`. Set to `false` to disable this feature, `true` to run `npm install` with `package.json` found in `path`. Or set to another filename which you want to use instead. diff --git a/package.py b/package.py index 6e19846c..1d1c3541 100644 --- a/package.py +++ b/package.py @@ -687,7 +687,9 @@ def step(*x): def hash(path): source_paths.append(path) - def pip_requirements_step(path, prefix=None, required=False, tmp_dir=None): + def pip_requirements_step( + path, prefix=None, required=False, tmp_dir=None, pip_install_extra_args=[] + ): command = runtime requirements = path if os.path.isdir(path): @@ -703,11 +705,23 @@ def pip_requirements_step(path, prefix=None, required=False, tmp_dir=None): "available in system PATH".format(command) ) - step("pip", runtime, requirements, prefix, tmp_dir) + step( + "pip", + runtime, + requirements, + prefix, + tmp_dir, + pip_install_extra_args, + ) hash(requirements) def poetry_install_step( - path, poetry_export_extra_args=[], prefix=None, required=False, tmp_dir=None + path, + poetry_export_extra_args=[], + prefix=None, + required=False, + tmp_dir=None, + pip_install_extra_args=[], ): pyproject_file = path if os.path.isdir(path): @@ -718,7 +732,15 @@ def poetry_install_step( "poetry configuration not found: {}".format(pyproject_file) ) else: - step("poetry", runtime, path, poetry_export_extra_args, prefix, tmp_dir) + step( + "poetry", + runtime, + path, + poetry_export_extra_args, + prefix, + tmp_dir, + pip_install_extra_args, + ) hash(pyproject_file) pyproject_path = os.path.dirname(pyproject_file) poetry_lock_file = os.path.join(pyproject_path, "poetry.lock") @@ -819,6 +841,7 @@ def commands_step(path, commands): else: prefix = claim.get("prefix_in_zip") pip_requirements = claim.get("pip_requirements") + pip_install_extra_args = claim.get("pip_install_extra_args", []) poetry_install = claim.get("poetry_install") poetry_export_extra_args = claim.get("poetry_export_extra_args", []) npm_requirements = claim.get( @@ -833,6 +856,7 @@ def commands_step(path, commands): prefix, required=True, tmp_dir=claim.get("pip_tmp_dir"), + pip_install_extra_args=pip_install_extra_args, ) else: pip_requirements_step( @@ -840,6 +864,7 @@ def commands_step(path, commands): prefix, required=True, tmp_dir=claim.get("pip_tmp_dir"), + pip_install_extra_args=pip_install_extra_args, ) if poetry_install and runtime.startswith("python"): @@ -850,6 +875,7 @@ def commands_step(path, commands): poetry_export_extra_args=poetry_export_extra_args, required=True, tmp_dir=claim.get("poetry_tmp_dir"), + pip_install_extra_args=pip_install_extra_args, ) if npm_requirements and runtime.startswith("nodejs"): @@ -937,9 +963,15 @@ def execute(self, build_plan, zip_stream, query): else: zs.write_file(source_path, prefix=prefix, timestamp=ts) elif cmd == "pip": - runtime, pip_requirements, prefix, tmp_dir = action[1:] + ( + runtime, + pip_requirements, + prefix, + tmp_dir, + pip_install_extra_args, + ) = action[1:] with install_pip_requirements( - query, pip_requirements, tmp_dir + query, pip_requirements, tmp_dir, pip_install_extra_args ) as rd: if rd: if pf: @@ -950,12 +982,21 @@ def execute(self, build_plan, zip_stream, query): # XXX: timestamp=0 - what actually do with it? zs.write_dirs(rd, prefix=prefix, timestamp=0) elif cmd == "poetry": - (runtime, path, poetry_export_extra_args, prefix, tmp_dir) = action[ - 1: - ] + ( + runtime, + path, + poetry_export_extra_args, + prefix, + tmp_dir, + pip_install_extra_args, + ) = action[1:] log.info("poetry_export_extra_args: %s", poetry_export_extra_args) with install_poetry_dependencies( - query, path, poetry_export_extra_args, tmp_dir + query, + path, + poetry_export_extra_args, + tmp_dir, + pip_install_extra_args, ) as rd: if rd: if pf: @@ -1048,7 +1089,7 @@ def _zip_write_with_filter( @contextmanager -def install_pip_requirements(query, requirements_file, tmp_dir): +def install_pip_requirements(query, requirements_file, tmp_dir, pip_install_extra_args): # TODO: # 1. Emit files instead of temp_dir @@ -1125,7 +1166,7 @@ def install_pip_requirements(query, requirements_file, tmp_dir): "--prefix=", "--target=.", "--requirement={}".format(requirements_filename), - ] + ] + pip_install_extra_args if docker: with_ssh_agent = docker.with_ssh_agent pip_cache_dir = docker.docker_pip_cache @@ -1175,7 +1216,9 @@ def install_pip_requirements(query, requirements_file, tmp_dir): @contextmanager -def install_poetry_dependencies(query, path, poetry_export_extra_args, tmp_dir): +def install_poetry_dependencies( + query, path, poetry_export_extra_args, tmp_dir, pip_install_extra_args +): # TODO: # 1. Emit files instead of temp_dir @@ -1301,7 +1344,8 @@ def copy_file_to_target(file, temp_dir): "--prefix=", "--target=.", "--requirement=requirements.txt", - ], + ] + + pip_install_extra_args, ] if docker: with_ssh_agent = docker.with_ssh_agent