V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
julyclyde
V2EX  ›  Python

依赖关系搞死人啊

  •  
  •   julyclyde ·
    julyclyde · 2015-07-23 15:00:05 +08:00 · 5615 次点击
    这是一个创建于 3440 天前的主题,其中的信息可能已经有所发展或是发生改变。
    昨天有一段代码,自己机器上正常,放到线上就挂了
    OAuth1 client的程序,用requests-oauthlib依赖oauthlib

    我自己机器上oauthlib==0.7.2 以前装的旧版本;线上服务器pip下载1.0.0
    结果发现其中signature.py内容改了,算法用pyjwt库实现,但oauthlib本身不强制依赖pyjwt,而是oauthlib[signedtoken]才依赖pyjwt,坑死人

    然后,装吧,又发现pyjwt依赖的cffi现场编译需要libffi-dev库。真是……最后定稿是给线上也用旧的oauthlib==0.7.2

    转到新岗位才7个工作日就搞出19分钟大事故。唉~
    31 条回复    2015-07-25 05:26:11 +08:00
    realpg
        1
    realpg  
       2015-07-23 15:03:01 +08:00
    我不是搞python的,对你说的问题细节不太清楚

    我只有一个问题

    为啥你们公司允许开发环境使用跟生产服务器不一样的版本的东西?
    clino
        2
    clino  
       2015-07-23 15:06:29 +08:00 via Android
    没有一个和生产环境一致的测试环境先试试看?
    mhycy
        3
    mhycy  
       2015-07-23 15:08:13 +08:00
    别的不说,改线上环境居然能造成19分钟停机,入口负载均衡怎么做的,没备机做平滑升级?
    nellace
        4
    nellace  
       2015-07-23 15:18:34 +08:00
    19分钟就是大事故了,肯定是个大厂啊
    neoblackcap
        5
    neoblackcap  
       2015-07-23 15:29:25 +08:00
    我只是好奇,为什么你们生产环境可以连开发环境的版本号都对不上
    learnshare
        6
    learnshare  
       2015-07-23 15:52:55 +08:00
    必须保证开发和运行环境统一,还得随手把第三方包升级了
    ChangxuBlack
        7
    ChangxuBlack  
       2015-07-23 15:55:04 +08:00
    或许可以试试用setuptools管理依赖
    glasslion
        8
    glasslion  
       2015-07-23 15:55:42 +08:00
    开发环境和生产环境的版本号都能搞得不一样, 出大事故不是早晚的事.

    而且当你们发现了版本号不一致的问题后, 为什么不第一时间回退到 0.7.2 这个老的可行版本, 反而去尝试去安装 1.0 这个你们从来没有使用和测试过的版本.
    yueyoum
        9
    yueyoum  
       2015-07-23 16:03:45 +08:00
    新人都这样, 遇到问题 不要慌

    先去问老员工。


    当年 我去线上 重启服务, 没看清, 把其他服务给重启了, 而且重启还失败了。。。
    julyclyde
        10
    julyclyde  
    OP
       2015-07-23 16:28:39 +08:00
    @glasslion 请你注意先后顺序。我是回滚了代码之后才检查到0.7.2和1.0.0的问题的
    laoyuan
        11
    laoyuan  
       2015-07-23 16:35:01 +08:00
    怪不得 Rails Gemfile 里面的gem 后面都跟着版本号,我初学觉得好麻烦啊
    est
        12
    est  
       2015-07-23 16:38:21 +08:00
    @laoyuan pip也可以,只是很多人懒得这么干而已。其实现在pip都支持打包成静态包了。
    julyclyde
        13
    julyclyde  
    OP
       2015-07-23 16:43:01 +08:00
    @mhycy 访问到我改的那个位置的时候才出错,错误信息是无法import jwt库,当时没理解为什么还有jwt。我还以为是别人的bug就没当场回滚。有部署权限的人太多也是个麻烦事啊
    julyclyde
        14
    julyclyde  
    OP
       2015-07-23 16:43:33 +08:00
    @ChangxuBlack pip就是setuptools的包装吧。给点儿建设性的意见
    julyclyde
        15
    julyclyde  
    OP
       2015-07-23 16:44:28 +08:00
    @glasslion 现在线上用旧版本,已经积习难改了。我怀疑将来requirements内部会有版本冲突
    julyclyde
        16
    julyclyde  
    OP
       2015-07-23 16:44:44 +08:00
    @learnshare 我这就是随手升级了才坏事的。
    poorguy
        17
    poorguy  
       2015-07-23 17:07:03 +08:00
    我就弱弱的问一下,没用virtualenv之类的吗
    julyclyde
        18
    julyclyde  
    OP
       2015-07-23 17:40:20 +08:00
    @poorguy 有。但这和virtualenv有啥关系?
    tabris17
        19
    tabris17  
       2015-07-23 18:31:18 +08:00
    为了避免麻烦,我把第三方库的代码复制出来和代码放一起打包了
    ChangxuBlack
        20
    ChangxuBlack  
       2015-07-23 22:27:05 +08:00
    @julyclyde 你可以写个setup.py,里面写上依赖啊,然后部署的时候用python setup.py install
    laotaitai
        21
    laotaitai  
       2015-07-23 23:01:06 +08:00
    上Docker, 把你开发搭建好的环境, 弄到线上去. 再也没有"我这里运行得好好的, 为嘛到你那里就不行呢"的问题了.
    poorguy
        22
    poorguy  
       2015-07-23 23:06:00 +08:00
    @julyclyde 那估计我没看懂你的主题了,virtualenv可以保证开发环境和生产环境一致
    julyclyde
        23
    julyclyde  
    OP
       2015-07-23 23:36:03 +08:00 via iPad
    @poorguy 你想得过远了。virtualenv可以用来维持一个稳定体系,我这里也用了。但往里加新包时的混乱,用不用v都会发生的
    julyclyde
        24
    julyclyde  
    OP
       2015-07-23 23:36:53 +08:00 via iPad
    @ChangxuBlack 目前有requirements 但r和setup.py都只能维持一瞬间的和平,很快还会被打破的
    hiddenman
        25
    hiddenman  
       2015-07-23 23:42:15 +08:00
    @realpg 我们测试用PHP5.5 线上用PHP5.4
    9hills
        26
    9hills  
       2015-07-24 00:45:02 +08:00 via iPhone
    Requirments 里不指定版本的锅。
    julyclyde
        27
    julyclyde  
    OP
       2015-07-24 08:13:06 +08:00 via iPad
    @9hills requirements里只写了我自己用的包。用的包依赖的其它包没写,就载在这里
    HowardMei
        28
    HowardMei  
       2015-07-24 09:24:09 +08:00   ❤️ 3
    一般的python库依赖用 https://pex.readthedocs.org/en/latest/ 打包就可以了,
    如果还依赖系统库,可以考虑 https://github.com/spotify/dh-virtualenv 打成deb包[alien deb->rpm]
    有篇文章讲了这个问题: https://nylas.com/blog/packaging-deploying-python
    julyclyde
        29
    julyclyde  
    OP
       2015-07-24 12:39:43 +08:00
    终于钓来一个有含金量的回复
    ChangxuBlack
        30
    ChangxuBlack  
       2015-07-24 22:44:16 +08:00
    @julyclyde 有道理,不过setup.py可以限定版本号。。。确实不好解决
    qqblog
        31
    qqblog  
       2015-07-25 05:26:11 +08:00
    没看懂1.0.0版本到底有什么问题,为什么没能编译libffi-dev库?难道是centos问题?只是你有问题吧,依赖并没问题,熟悉就好啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2688 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:31 · PVG 16:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.