anaconda / anaconda-project

Tool for encapsulating, running, and reproducing data science projects
https://anaconda-project.readthedocs.io/en/latest/
Other
219 stars 88 forks source link

anaconda-project lock fails for env_specs with no packages #260

Open sanbales opened 4 years ago

sanbales commented 4 years ago

When composing environments, sometimes it is useful to create an env_spec that specifies things that can be inherited by other environments, but have no packages in themselves.

When you try to lock such a project file, you get a TypeError

TypeError: ('must specify a list of one or more packages to install into existing environment, not %r', ())

Would it be possible to skip such environments? Maybe throw a warning, but not an error?

I've shared an illustrative example of such an anaconda-project.yml below. anaconda-project lock fails when it gets to the _channels env_spec.

name: main_environment

platforms:
  - linux-64
  - win-64

env_specs:
  my_main_env:
    description: the actual end-user environment
    inherit_from:
      - _lab
    packages:
      - numpy
      - scipy
      - spacy

  _jsbuild:
    description: the build env for a JupyterLab app_dir
    inherit_from:
      - _lab
      - _js

  ### The environments below contain the common dependencies
  ### these environments are never installed
  _channels:
    description: all our channels (never installed)
    channels:
      - conda-forge
      - defaults

  _py:
    description: our python version (never installed)
    inherit_from:
      - _channels
    packages:
      - python >=3.7,<3.8.0a0

  _js:
    description: our node (never installed)
    inherit_from:
      - _channels
    packages:
      - nodejs >=12.16.0,<13.0.0a0

  _conda:
    description: our conda version (never installed)
    inherit_from:
      - _py
    packages:
      - conda >=4.8,<4.9.0a0
      - python-libarchive-c

  _lab:
    description: capture our JupyterLab dependencies (never installed)
    inherit_from:
      - _py
    packages:
      - jupyterlab >=1.0,<2
sanbales commented 4 years ago

Traceback in case it helps...

Bug details for anaconda-project error on 2020-04-03

sys.argv: ['C:\\cnd\\Scripts\\anaconda-project', 'lock']

{'version': '0.8.3'}

Traceback (most recent call last):

  File "C:\cnd\lib\site-packages\anaconda_project\internal\cli\bug_handler.py", line 31, in handle_bugs
    return main_func()

  File "C:\cnd\lib\site-packages\anaconda_project\internal\cli\main.py", line 366, in _main_without_bug_handler
    return _parse_args_and_run_subcommand(sys.argv)

  File "C:\cnd\lib\site-packages\anaconda_project\internal\cli\main.py", line 358, in _parse_args_and_run_subcommand
    return args.main(args)

  File "C:\cnd\lib\site-packages\anaconda_project\internal\cli\environment_commands.py", line 223, in main_lock
    return lock(args.directory, args.name)

  File "C:\cnd\lib\site-packages\anaconda_project\internal\cli\environment_commands.py", line 149, in lock
    status = project_ops.lock(project, env_spec_name=env_spec_name)

  File "C:\cnd\lib\site-packages\anaconda_project\project_ops.py", line 908, in lock
    return _update_and_lock(project, env_spec_name, update=False)

  File "C:\cnd\lib\site-packages\anaconda_project\project_ops.py", line 826, in _update_and_lock
    lock_set = conda.resolve_dependencies(env.conda_packages, env.channels, env.platforms)

  File "C:\cnd\lib\site-packages\anaconda_project\internal\default_conda_manager.py", line 217, in resolve_dependencies
    deps = conda_api.resolve_dependencies(pkgs=package_specs, platform=conda_platform, channels=channels)

  File "C:\cnd\lib\site-packages\anaconda_project\internal\conda_api.py", line 298, in resolve_dependencies
    pkgs)

TypeError: ('must specify a list of one or more packages to install into existing environment, not %r', ())