【问题标题】:Heroku Django setup install_requires from github来自 github 的 Heroku Django 设置 install_requires
【发布时间】:2020-03-07 06:40:37
【问题描述】:

我有一个 heroku 项目正在尝试使用 pip install -r requirements.txt 安装 Django reusable app(这不是来自官方 heroku/python buildpack 的确切命令,但它基本上是这样做的)。

问题是我的 Django 可重用应用程序本身有一个来自 Github 公共存储库的需求。

pip install dependency links中的几个答案指向:

我的 Django 项目可以以不同的方式部署:Heroku、本地、Docker(开发和产品)。这些部署方法中的大多数都有最新版本的 pip。

Heroku 的 python buildpack 有 Pip 9.0.2

我的其他部署方法具有 Pip 19,因此它们在读取需求的方式上存在不兼容性,我无法找到适用于两者的方法。

对于旧版本的 pip,我在我的setup.py

setup(
# [...]
install_requires=[
        "my_package == x.y.z"
    ],
    dependency_links=["git+https://github.com/account/package/tarball/master#egg=my_package-x.y.z"]
)

而对于 Pip 19,我愿意:

setup(
# [...]
install_requires=[
        "my_package @ git+https://github.com/company/package.git"
    ],
)

我尝试分叉存储库并将版本增加到 pip 的最新版本。它确实有效,除了pip-diff 中的错误,这似乎对构建没有影响。

还需要注意的是,由于 buildpack 有一个缓存系统,您通常只会注意到这个问题一次,直到您需要更新版本的库。但是,例如评论应用程序就会出现问题。

那么这里的解决方案是什么?我可以:

  1. 将所有其他部署方法降级为使用依赖链接的旧版本 pip,包括我的所有本地开发设置
  2. 使用 Heroku 的 python buildpack 的分叉版本,并更新了 pip(但 pip-diff 需要修复)
  3. 从 github 中删除依赖项,并在项目存储库级别而不是可重用应用级别添加这些依赖项。
  4. 向官方 repo 提交 PR,以便升级 pip

这就是我能想到的。解决方案 1. 和 2. 真的很糟糕,恕我直言,3. 更糟糕,4. 可能需要时间,我真的负担不起。

有更好的想法吗?

【问题讨论】:

    标签: django heroku pip


    【解决方案1】:

    pip 表示法与 setuptools 表示法不同。没有立即更改设置脚本的理由。 install_requiresdependency_links 在第一个版本中看起来不错,如果它曾经可以工作,可能实际上是这样。

    现在,pip 的较新版本确实根本不考虑 setuptoolsdependency_links。因此,这些自定义依赖链接可以添加到 requirements.txt 文件中(当然使用 pip 符号)。

    此外,您可以选择完全删除设置脚本中的 dependency_links 参数以避免重复。

    【讨论】:

    • 您的意思是添加到正在添加的包的requirements.txt,还是添加到导入包的项目的requirements.txt?因为如果是后者,恕我直言,这不是一个好的解决方案
    • 从我(以及我认为的 pip 维护者)的角度来看,原因是:如果我使用 pip 来安装 Python包及其依赖项,我假设它们都将从我信任的托管服务 PyPI 下载,但如果依赖项违反此合同并需要来自不同主机的代码,我当然不能接受.这就是为什么 依赖链接 应该只由实际触发安装的人执行,即应用程序的requirements.txt库只需要清楚地记录它们是否需要 PyPI 上没有的依赖项
    • 好的,我明白了。我会看看这是否适用于我的同事。感谢您的澄清。
    【解决方案2】:

    我不知道是不是正确答案,但我用了this workaround

    所以基本上在我的setup.py 中我添加了一个函数并调用它:

    def install_github_package(github_url):
        try:
            import github_url
            # ... do some version checking ...
        except (ModuleNotFoundError, ImportError):
            if '--user' in sys.argv:
                subprocess.run([sys.executable, '-m', 'pip', 'install', '--upgrade',
                                '--user', github_url], check=False)
            else:
                subprocess.run([sys.executable, '-m', 'pip', 'install', '--upgrade',
                                github_url], check=False)
    
    install_github_package("git+https://github.com/company/package.git")
    

    【讨论】:

    • 如果它适用于您的用例,那就去吧。但是,如果您使用 pip,最重要的是,如果您的应用程序已经有一个 requirements.txt 文件,那么将依赖项的自定义链接放在这个文件中可能是一个更好的解决方案。
    • 我尝试使用你告诉我的方式,我忘了提到我使用pip-tools,如果我按照你所说的进行pip-compile,我会遇到麻烦,即: - 保持install_requires 和dependency_links - 在requirements.in 中添加我的依赖项 - 尝试运行pip-compile 在这种情况下我应该怎么做?在pip-compile?生成的文件中手动添加一行?
    • 我不知道 pip-tools,帮不上什么忙。但是通过快速查看它的 README,我想说将自定义 git 依赖链接添加到 requirements.in,是的。或者您可能必须在之后手动编辑requirements.txt
    • 是的,将其放在.in 中不起作用...我想我必须在之后添加它...这就是我的问题,它似乎与 pip 不完全兼容生态系统,但这只是我的意见。
    • 很惊讶它不起作用。如果我是你,我会从一个专门针对 pip-compile 的新问题开始,或者直接在他们的问题跟踪器中提问。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2012-10-11
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多