Skip to content

Support local wheel files in pip_install requirements.txt #366

@aaliddell

Description

@aaliddell

🚀 feature request

Relevant Rules

pip_install

Description

If you have a local .whl file in the workspace, you can add it to the requirements.txt file like so:

./path/to/wheel.whl
file:path/to/wheel.whl

Presently, this results in an error when attempting fetch the wheels, since pip is not running in the workspace root:

Traceback (most recent call last):                                                                                                                                                                                                                                             
  File "<snip>/external/pypi__pip/pip/_internal/cli/base_command.py", line 153, in _main                                                                                                         
    status = self.run(options, args)                                                                                                                                                                                                                                           
  File "<snip>/external/pypi__pip/pip/_internal/commands/wheel.py", line 158, in run                                                                                                             
    resolver.resolve(requirement_set)                                                                                                                                                                                                                                          
  File "<snip>/external/pypi__pip/pip/_internal/legacy_resolve.py", line 201, in resolve                                                                                                         
    self._resolve_one(requirement_set, req)                                                                                                                                                                                                                                    
  File "<snip>/external/pypi__pip/pip/_internal/legacy_resolve.py", line 365, in _resolve_one                                                                                                    
    abstract_dist = self._get_abstract_dist_for(req_to_install)                                                                                                                                                                                                                
  File "<snip>/external/pypi__pip/pip/_internal/legacy_resolve.py", line 313, in _get_abstract_dist_for                                                                                          
    req, self.session, self.finder, self.require_hashes                                                                                                                                                                                                                        
  File "<snip>/external/pypi__pip/pip/_internal/operations/prepare.py", line 194, in prepare_linked_requirement                                                                                  
    progress_bar=self.progress_bar                                                                                                                                                                                                                                             
  File "<snip>/external/pypi__pip/pip/_internal/download.py", line 452, in unpack_url                                                                                                            
    unpack_file_url(link, location, download_dir, hashes=hashes)                                                                                                                                                                                                               
  File "<snip>/external/pypi__pip/pip/_internal/download.py", line 398, in unpack_file_url                                                                                                       
    hashes.check_against_path(link_path)                                                                                                                                                                                                                                       
  File "<snip>/external/pypi__pip/pip/_internal/utils/hashes.py", line 104, in check_against_path                                                                                                
    with open(path, 'rb') as file:                                                                                                                                                                                                                                             
FileNotFoundError: [Errno 2] No such file or directory: '<snip>/<snip>-py3-none-any.whl'                                                                                                                                                                       
Traceback (most recent call last):                                                                                                                                                                                                                                             
  File "/usr/local/lib/python3.7/runpy.py", line 193, in _run_module_as_main                                                                                                                                                                                                   
    "__main__", mod_spec)                                                                                                                                                                                                                                                      
  File "/usr/local/lib/python3.7/runpy.py", line 85, in _run_code                                                                                                                                                                                                              
    exec(code, run_globals)                                                                                                                                                                                                                                                    
  File "<snip>/external/rules_python/python/pip_install/extract_wheels/__main__.py", line 5, in <module>                                                                                         
    main()                                                                                                                                                                                                                                                                     
  File "<snip>/external/rules_python/python/pip_install/extract_wheels/__init__.py", line 87, in main                                                                                            
    subprocess.run(pip_args, check=True)                                                                                                                                                                                                                                       
  File "/usr/local/lib/python3.7/subprocess.py", line 512, in run                                                                                                                                                                                                              
    output=stdout, stderr=stderr)                                                                                                                                                                                                                                              
subprocess.CalledProcessError: Command '['/usr/bin/python3.7', '-m', 'pip', 'wheel', '-r', '<snip>/requirements.txt']' returned non-zero exit status 2. 

Describe the solution you'd like

The extract_wheels script could convert relative wheel paths to absolute wheel paths prior to running pip wheel. It already has the full path to the requirements.txt file, so would just snip off the end and replace with relative path provided in requirements.txt.

Describe alternatives you've considered

  • Using whl_library, but this is not recommended and does not load dependencies of the local wheel.
  • Using absolute path in requirements.txt. This appears to work, but the path is not portable across different environments.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions