diff --git a/docs/docs/cli.md b/docs/docs/cli.md
index 89d19a8cc18..58f493a0d0e 100644
--- a/docs/docs/cli.md
+++ b/docs/docs/cli.md
@@ -245,6 +245,7 @@ poetry add "git+https://github.com/pallets/flask.git@1.1.1[dotenv,dev]"
* `--path`: The path to a dependency.
* `--optional` : Add as an optional dependency.
* `--dry-run` : Outputs the operations but will not execute anything (implicitly enables --verbose).
+* `--global-option` : Pass the --global-option=\ parameter to pip upon installation.
## remove
diff --git a/poetry/console/commands/add.py b/poetry/console/commands/add.py
index 275fc44f5f1..d775ce4a836 100644
--- a/poetry/console/commands/add.py
+++ b/poetry/console/commands/add.py
@@ -33,6 +33,13 @@ class AddCommand(EnvCommand, InitCommand):
"Platforms for which the dependency must be installed.",
flag=False,
),
+ option(
+ "--global-option",
+ None,
+ "Pass --global-option=' ' to pip on install.",
+ flag=False,
+ multiple=True,
+ ),
option("allow-prereleases", None, "Accept prereleases."),
option(
"dry-run",
@@ -123,6 +130,9 @@ def handle(self):
if self.option("platform"):
constraint["platform"] = self.option("platform")
+ if self.option("global-option"):
+ constraint["global-options"] = self.option("global-option")
+
if len(constraint) == 1 and "version" in constraint:
constraint = constraint["version"]
diff --git a/poetry/installation/pip_installer.py b/poetry/installation/pip_installer.py
index aada0cd0190..c550cbca039 100644
--- a/poetry/installation/pip_installer.py
+++ b/poetry/installation/pip_installer.py
@@ -73,6 +73,15 @@ def install(self, package, update=False):
if update:
args.append("-U")
+ try:
+ if package.dependency.global_opts:
+ for global_opt in package.dependency.global_opts:
+ args.append(
+ "--global-opt={global_opt}".format(global_opt=global_opt)
+ )
+ except AttributeError: # No dependency.
+ pass
+
if package.files and not package.source_url:
# Format as a requirements.txt
# We need to create a requirements.txt file
diff --git a/poetry/json/schemas/poetry-schema.json b/poetry/json/schemas/poetry-schema.json
index 10aff39e502..311c667a061 100644
--- a/poetry/json/schemas/poetry-schema.json
+++ b/poetry/json/schemas/poetry-schema.json
@@ -266,6 +266,13 @@
"type": "string"
}
},
+ "global-options": {
+ "type": "array",
+ "description": "--global-options directives for PIP.",
+ "items": {
+ "type": "string"
+ }
+ },
"source": {
"type": "string",
"description": "The exclusive source used to search for this dependency."
diff --git a/poetry/packages/dependency.py b/poetry/packages/dependency.py
index 83ad36a129c..7ce925cd010 100644
--- a/poetry/packages/dependency.py
+++ b/poetry/packages/dependency.py
@@ -27,6 +27,7 @@ def __init__(
category="main", # type: str
allows_prereleases=False, # type: bool
source_name=None, # type: Optional[str]
+ global_options=[], # type: list[str]
):
self._name = canonicalize_name(name)
self._pretty_name = name
@@ -60,6 +61,8 @@ def __init__(
self._extras = []
self._in_extras = []
+ self.global_opts = list(global_options)
+
self._activated = not self._optional
self.is_root = False
diff --git a/poetry/packages/package.py b/poetry/packages/package.py
index 5b7dfea09d1..07a8c85a336 100644
--- a/poetry/packages/package.py
+++ b/poetry/packages/package.py
@@ -374,6 +374,10 @@ def add_dependency(
if "extras" in constraint:
for extra in constraint["extras"]:
dependency.extras.append(extra)
+
+ if "global-options" in constraint:
+ for global_opt in constraint["global-options"]:
+ dependency.global_opts.append(global_opt)
else:
dependency = Dependency(name, constraint, category=category)
diff --git a/tests/console/commands/test_add.py b/tests/console/commands/test_add.py
index 6a64ba7e4eb..10efcc8c205 100644
--- a/tests/console/commands/test_add.py
+++ b/tests/console/commands/test_add.py
@@ -100,6 +100,42 @@ def test_add_constraint_with_extras(app, repo, installer):
command = app.find("add")
tester = CommandTester(command)
+ cachy1 = get_package("cachy", "0.1.0")
+ cachy1.extras = {"msgpack": [get_dependency("msgpack-python")]}
+ msgpack_dep = get_dependency(
+ "msgpack-python", None, optional=True, global_options="Include"
+ )
+ cachy1.requires = [msgpack_dep]
+
+ repo.add_package(get_package("cachy", "0.2.0"))
+ repo.add_package(cachy1)
+ repo.add_package(get_package("msgpack-python", "0.5.3"))
+
+ tester.execute("cachy[msgpack]>=0.1.0,<0.2.0")
+
+ expected = """\
+
+Updating dependencies
+Resolving dependencies...
+
+Writing lock file
+
+
+Package operations: 2 installs, 0 updates, 0 removals
+
+ - Installing msgpack-python (0.5.3)
+ - Installing cachy (0.1.0)
+"""
+
+ assert expected == tester.io.fetch_output()
+
+ assert len(installer.installs) == 2
+
+
+def test_add_constraint_with_global_options(app, repo, installer):
+ command = app.find("add")
+ tester = CommandTester(command)
+
cachy1 = get_package("cachy", "0.1.0")
cachy1.extras = {"msgpack": [get_dependency("msgpack-python")]}
msgpack_dep = get_dependency("msgpack-python", ">=0.5 <0.6", optional=True)
diff --git a/tests/helpers.py b/tests/helpers.py
index 6f5f73f163b..12b73a83185 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -18,7 +18,12 @@ def get_package(name, version):
def get_dependency(
- name, constraint=None, category="main", optional=False, allows_prereleases=False
+ name,
+ constraint=None,
+ category="main",
+ optional=False,
+ allows_prereleases=False,
+ global_options=[],
):
return Dependency(
name,
@@ -26,6 +31,7 @@ def get_dependency(
category=category,
optional=optional,
allows_prereleases=allows_prereleases,
+ global_options=global_options,
)