Repository: python-poetry/poetry

Issue:
Poetry install takes too long and installs the package again unnecessarily
<!--
  Hi there! Thank you for wanting to make Poetry better.

  Before you submit this; let's make sure of a few things.
  Please make sure the following boxes are ticked if they are correct.
  If not, please try and fulfill these first.
-->

<!-- Checked checkbox should look like this: [x] -->
- [X] I have searched the [issues](https://github.com/sdispater/poetry/issues) of this repo and believe that this is not a duplicate.

## Issue
<!-- Now feel free to write your idea for improvement. Thanks again 🙌 ❤️ -->

I'm wondering why it takes 13-30 seconds to install my package (on two different machines). 
This occurs when the package and it's dependencies are already installed.
`$ time poetry install -vvv
Using virtualenv: /Users/apayne/Envs/smithers
Installing dependencies from lock file

Nothing to install or update

  - Skipping markupsafe (1.1.0) Already installed
  - Skipping click (7.0) Already installed
  - Skipping itsdangerous (1.1.0) Already installed
  - Skipping jinja2 (2.10) Already installed
  - Skipping werkzeug (0.14.1) Already installed
  - Skipping aniso8601 (4.0.1) Already installed
  - Skipping flask (1.0.2) Already installed
  - Skipping jsonschema (2.6.0) Already installed
  - Skipping pytz (2018.7) Already installed
  - Skipping six (1.11.0) Already installed
  - Skipping flask-restplus (0.12.1) Already installed
  - Skipping passlib (1.7.1) Already installed
  - Skipping peewee (3.7.1) Already installed
  - Installing smithers (0.1.0)

real	0m29.542s
user	0m5.344s
sys 0m2.370s`

Smithers is the name of the package I'm installing with poetry.  The installing smithers step takes the majority of the time.  Is poetry doing anything but creating a symlink?  I don't understand why this should take so long.  If the package is already installed in editable mode, why does poetry try installing it again?

Much thanks!


Discussion:
The `install` command installs the current project in editable mode by internally creating a temporary `setup.py` file and executing `pip install -e .`. It does it each time `install` is executed to ensure that any new elements like entrypoints are properly installed.

I plan on adding an option to `install` to disable the installation of the current project.
@sdispater is there any reason for the use of a `setup.py` instead of creating the appropriate directory structure/updating the virtual env directly?

If there is a better ticket to mention this in, please let me know. 
@bertjwregeer For pure python projects, we could do without the `setup.py` file. This would require creating the proper files and directories which are, as far as I know, an `easy_install.pth` in the `site-packages` directory of the virtualenv and the `{project}.egg-info` directory in the current directory project.

This is not possible however for packages with C extensions for instance. Poetry does not come with a compiler and as such has to rely on the `setup.py` file.
The current "hack" for Poetry to do C extensions is to add extra content to the setup.py that is generated, correct? If it can be detected when that is the case and only then do the setup.py way, that would be fantastic.

Building plugins to allow building Cython/C extensions for poetry would be even better, but that can come later.
My current workaround is to use the `--dry-run` argument as a default in my build script for development. I just override that argument when I actually want it to `poetry install`.
@bertjwregeer This is one way to go, yes, and an easy one. I can probably target that for the `1.0.0` release.

Resolving patch:
diff --git a/poetry/console/commands/install.py b/poetry/console/commands/install.py
--- a/poetry/console/commands/install.py
+++ b/poetry/console/commands/install.py
@@ -9,6 +9,7 @@ class InstallCommand(EnvCommand):
 
     install
         { --no-dev : Do not install dev dependencies. }
+        { --no-root : Do not install the root package (your project). }
         { --dry-run : Outputs the operations but will not execute anything
                       (implicitly enables --verbose). }
         { --E|extras=* : Extra sets of dependencies to install. }
@@ -55,6 +56,9 @@ def handle(self):
         if return_code != 0:
             return return_code
 
+        if not self.option("no-root"):
+            return 0
+
         try:
             builder = SdistBuilder(self.poetry, NullEnv(), NullIO())
         except ModuleOrPackageNotFound:


Test patch: