首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Snapcraft python只打包依赖项,而不打包app?

Snapcraft python只打包依赖项,而不打包app?
EN

Stack Overflow用户
提问于 2017-02-28 07:01:09
回答 1查看 692关注 0票数 1

我有一个非常标准的python应用程序,包括setup.pyrequirements.txt,它可以很好地与pip一起安装

代码语言:javascript
复制
$ pip install .
$ tree -L 1 env/lib/python3.5/site-packages/

env2/lib/python3.5/site-packages/
├── myAPP 
├── myAPP-0.1.0-py3.5.egg-info
...

我想使用snaps来构建和部署应用程序,并注意到snapcraft只安装我的应用程序的依赖项,而不是应用程序本身。它确实构建了一个轮子,但没有安装它:

代码语言:javascript
复制
$ snapcraft
....
Building wheels for collected packages: myAPP, blist
...
Successfully built myAPP blist
/home/ubuntu/parts/myAPP/install/usr/bin/python3 -m pip install --user 
    --no-compile --disable-pip-version-check --no-index 
    --find-links /home/ubuntu/parts/myAPP/packages blist 
    <other_requirements> --no-deps --upgrade

有人知道为什么myAPP不是pip安装的一部分吗?

作为参考,snapcraft.yaml在这个阶段非常简单,但我认为这应该是所需的全部内容。Snapcraft是Ubuntu16.04上的v2.27.1

代码语言:javascript
复制
name: myAPP
version: '0.0.1'
summary: myAPP web application
description: |
  myAPP main web application

grade: devel 
confinement: strict

apps:
  myAPP:
    command: gunicorn myApp.wsgi
    daemon: simple
    plugs:
      - network-bind

parts:
  myAPP:
    plugin: python
    python-version: python3
    source: /opt/backend/

进展

在构建应用程序后,我检查了安装了哪些包:

代码语言:javascript
复制
$ parts/myAPP/install/bin/pip list --format columns
Package                 Version  Location           
----------------------- -------- -------------------
appdirs                 1.4.2    
blist                   1.3.6    
myAPP                   0.1.0    /opt/backend
....

如果我随后手动重新运行pip install -U myAPP,它确实会包含在site-packages中。我将看看我是否可以分别重复其他构建步骤。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-28 08:02:00

通过修补snapcraft python插件(在我的系统上使用/usr/lib/python3/dist-packages/snapcraft/plugins/python.py)找到了一个解决方法:

代码语言:javascript
复制
--- /usr/lib/python3/dist-packages/snapcraft/plugins/python.py  2017-02-17 13:45:14.000000000 +0000
+++ python.py   2017-03-02 01:53:54.993148168 +0000
@@ -298,7 +298,7 @@
                 # we want to avoid installing what is already provided in
                 # stage-packages
                 need_install = [k for k in wheel_names if k not in installed]
-                pip.install(need_install + ['--no-deps', '--upgrade'])
+                pip.install(wheel_names + ['--no-deps', '--upgrade', '--ignore-installed'])

     def _fix_permissions(self):
         for root, dirs, files in os.walk(self.installdir):

我希望这个问题有一个更干净的解决方案?同时,您可以将上面的补丁复制到名为patch.diff的文件中,并使用以下命令进行应用:

代码语言:javascript
复制
sudo patch -b /usr/lib/python3/dist-packages/snapcraft/plugins/python.py patch.diff
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42497369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档