diff --git a/poetry/console/commands/lock.py b/poetry/console/commands/lock.py
index ddedb055d87..2fae0abc26b 100644
--- a/poetry/console/commands/lock.py
+++ b/poetry/console/commands/lock.py
@@ -1,3 +1,5 @@
+from cleo import option
+
from .installer_command import InstallerCommand
@@ -6,6 +8,12 @@ class LockCommand(InstallerCommand):
name = "lock"
description = "Locks the project dependencies."
+ options = [
+ option(
+ "no-update", None, "Do not update locked versions, only refresh lock file."
+ ),
+ ]
+
help = """
The lock command reads the pyproject.toml> file from the
current directory, processes it, and locks the dependencies in the poetry.lock>
@@ -21,6 +29,6 @@ def handle(self):
self.poetry.config.get("experimental.new-installer", False)
)
- self._installer.lock()
+ self._installer.lock(self.option("no-update"))
return self._installer.run()
diff --git a/poetry/installation/installer.py b/poetry/installation/installer.py
index f0c9a62d65d..553a3c8c36c 100644
--- a/poetry/installation/installer.py
+++ b/poetry/installation/installer.py
@@ -85,6 +85,10 @@ def set_locker(self, locker): # type: (Locker) -> Installer
return self
def run(self):
+ # Check if refresh
+ if not self._update and self._lock and self._locker.is_locked():
+ self._do_refresh()
+
# Force update if there is no lock file present
if not self._update and not self._locker.is_locked():
self._update = True
@@ -137,11 +141,11 @@ def update(self, update=True): # type: (bool) -> Installer
return self
- def lock(self): # type: () -> Installer
+ def lock(self, update=True): # type: (bool) -> Installer
"""
Prepare the installer for locking only.
"""
- self.update()
+ self.update(update=update)
self.execute_operations(False)
self._lock = True
@@ -173,6 +177,33 @@ def use_executor(self, use_executor=True): # type: (bool) -> Installer
return self
+ def _do_refresh(self):
+ from poetry.puzzle import Solver
+
+ locked_repository = self._locker.locked_repository(True)
+
+ # Checking extras
+ for extra in self._extras:
+ if extra not in self._package.extras:
+ raise ValueError("Extra [{}] is not specified.".format(extra))
+
+ solver = Solver(
+ self._package,
+ self._pool,
+ self._installed_repository,
+ locked_repository,
+ self._io,
+ remove_untracked=self._remove_untracked,
+ )
+
+ ops = solver.solve(use_latest=[])
+
+ local_repo = Repository()
+ self._populate_local_repo(local_repo, ops)
+
+ if self._update or self._lock:
+ self._write_lock_file(local_repo)
+
def _do_install(self, local_repo):
from poetry.puzzle import Solver
@@ -229,7 +260,7 @@ def _do_install(self, local_repo):
self._populate_local_repo(local_repo, ops)
- if self._update:
+ if self._update or self._lock:
self._write_lock_file(local_repo)
if self._lock: