【问题标题】:What is a DRY way to package a pipenv project?打包 pipenv 项目的 DRY 方式是什么?
【发布时间】:2017-10-04 08:55:13
【问题描述】:

我将pipenv 用于a small project。该代码看起来可能很有用,我想通过pypi 分发它。我在 pipenv 网页或其 github repo 上找不到有关如何完成此操作的任何指导。

我可以将 Pipfile.lock 中的依赖项放入 setup.pyinstall_requires section 中,但我找不到自动执行此操作的工具,而且手动操作不会 DRY。

有人有更好的建议吗?

【问题讨论】:

  • install_requrements 可以动态生成,文件为JSON。您只需要编写一个函数即可从中生成正确的列表。
  • 干杯。我会尝试一下并在这里发布我的解决方案¯_(ツ)_/¯

标签: python pypi pipenv


【解决方案1】:

支持外部 git 依赖和版本。我已经更新了一点 winni2kk 代码。

import os
from setuptools import setup, find_packages
import json


def get_requirements_from_pipfile_lock(pipfile_lock=None):
    if pipfile_lock is None:
        pipfile_lock = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'Pipfile.lock')
    lock_data = json.load(open(pipfile_lock))
    retval = []
    for package_name, package_data in lock_data.get('default', {}).items():
        if package_data.get('file'):
            package_ref = f'{package_name} @ {package_data["file"]}'
        else:
            package_ref = f'{package_name}{package_data["version"]}'
        retval.append(package_ref)
    return retval


packages = find_packages('.', exclude=['*.test', '*.test.*'])
pipfile_lock_requirements = get_requirements_from_pipfile_lock()

setup(
    name='my_package',
    version='0.0.1',
    packages=packages,
    license='MIT',
    long_description=open('README.md').read(),
    install_requires=pipfile_lock_requirements,
    python_requires=">=3.5",
)

重要提示:在 MANIFEST.in 中包含 Pipfile.lock,例如:

包括 Pipfile.lock

【讨论】:

    【解决方案2】:

    这似乎对我有用:

    import os
    from setuptools import setup, find_packages
    import json
    
    
    def get_requirements_from_pipfile_lock(pipfile_lock=None):
        if pipfile_lock is None:
            pipfile_lock = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'Pipfile.lock')
        lock_data = json.load(open(pipfile_lock))
        return [package_name for package_name in lock_data.get('default', {}).keys()]
    
    
    packages = find_packages('.', exclude=['*.test', '*.test.*'])
    pipfile_lock_requirements = get_requirements_from_pipfile_lock()
    
    setup(
        name='my_package',
        version='0.0.1',
        packages=packages,
        license='MIT',
        long_description=open('README.md').read(),
        install_requires=pipfile_lock_requirements,
        python_requires=">=3.5",
    )
    

    【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多