V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Allianzcortex
V2EX  ›  程序员

心态炸裂,感觉遇到了 MrMEEE 事件的再现,开源项目真的不容易

  •  
  •   Allianzcortex · 2018-10-21 04:35:03 +08:00 · 1610 次点击
    这是一个创建于 1985 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是昨天晚上发生的事情,已经记不清一些细节了,但崩溃的心情到现在还犹在心头......还记得当时做完后大脑一片空白心力交瘁的感觉。

    大致经过是需要编译一个前端,所以就是 npm && gulp && bower install 开始按照说明配置。中间经历了很多小问题(配置过前端的同学应该都懂😭,就是不痛不痒但很 tricky 占用时间,当时心态已经有点不太好),之后遇到了这个 Bug:

    File "<String>"  line1
        import sys;print "%s.%s.%s" % sys.version_info[:3];
        
    SyntaxError invalid syntax
    
    

    看的时候心里大约是 WTF,因为知道有 js 有需要配置 C++ 的,有需要下载 dev-tool 的,但需要 Python 来支持运行还是少见。Python 2/3 著名区别是 print 在 Python2 是一个 statement,可以直接输出其他元素;而 print 在 Python3 是一个 function,必须要用 print() 来输出。所以这行语句就仅适合 Python2,而在 Python3 中无法使用。

    然后看 StackTrace,发现对应的项目是有 4.6k+ star 的项目 node-gyp。所以就找到对应的 commit,发现来自于一个对应的 PR-1504,具体的修改信息是在 这里,原来的语句是 var args = ['-c', 'import platform; print(platform.python_version());'], 适用于 2 和 3 版本,修改后才变成了 var args = ['-c', 'import sys; print "%s.%s.%s" % sys.version_info[:3];']

    在那条 PR 里可以看到有人在 8 月份的时候已经发现了这个问题并提出了修复, [ this broke python3, i created a PR with a small fix here #1534 ] ,官方回应是说还需要一段时间来进行修复 [ so it might take some time for this to get to the public.] 。

    这件事真的证明了单测的重要性,真的很多看起来没有问题的修改不知不觉就会改变程序的运行方式啊 !


    1.后续是直接下了一个 python2.7 后 config --path 临时指定了一个版本,但发现还是有问题,就直接放弃构建项目了,直接睡觉......

    2.node-gyp 项目对 Python 的 官方支持版本说明 说明很模糊,不知道 recommened 对应的反面是完全不能支持还是可以运行但效果不好

    whileFalse
        1
    whileFalse  
       2018-10-21 04:38:41 +08:00
    node-gyp 本来就是不兼容 python3 的,和单元测试有个毛线关系。
    Allianzcortex
        2
    Allianzcortex  
    OP
       2018-10-21 04:43:48 +08:00
    @whileFalse 您可以看我在分界线下面的说明哈~ README.md 里提到了这个,但我理解是如果完全不支持 Python3 的话那条改正的 PR( https://github.com/nodejs/node-gyp/pull/1534) 就可以直接回复说不支持,没必要回复说 [thank you for following up. We'll land this soon, then we need to release a new version and get that landed in npm so it might take some time for this to get to the public] 考虑合并,所以就有点困惑
    whileFalse
        3
    whileFalse  
       2018-10-21 05:01:27 +08:00
    @Allianzcortex 我理解报错的这个部分是用于测试当前 python 环境的版本号的。也就是说如果 python 是 3,则应该显示一个易于理解的信息,说明 node-gyp 不能在当前环境下工作,而不是直接崩掉。这一测试代码应该能兼容 2 和 3。

    你说得对这确实是单元测试可以检查出的问题。不过,这显然也无法让 node-gyp 的主程序在 py3 下运行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   997 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:02 · PVG 04:02 · LAX 13:02 · JFK 16:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.