Rails初入的环境问题

起因

博主是从RubyConf China 2020开始前一天才开始写Ruby的Hello World. 在了解了Ruby各种应用和社区发展以后(这个以后有空再补充) , 觉得很有趣, 自然工作之余开始了Ruby和Rails的学习.

参照Ruby China中的入门教程开始配置环境, 期间也遇到过不少的问题. 有些问题是新手角度特有的, 有些问题是Rails更新结合国内特有的网络环境后新引入. 本来只是自己记录的笔记, 但后来在群聊中多次见到相关的问题, 所以发出来希望能给碰到相同问题的朋友一些参考吧.

gem源问题

报错类似以下形式:

1
2
3
4
5
6
ERROR: While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
timed out (https://api.rubygems.org/latest_specs.4.8.gz)

ERROR: Could not find a valid gem 'rails' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - timed out (https://api.rubygems.org/specs.4.8.gz)

可能的原因:

  1. 本机的DNS无法获得rubygems.org的IP地址
    修改本机的DNS, 确保能正常获取到地址, 可以通过curl/wget下载文件来测试问题是否解决.
    1
    curl https://api.rubygems.org/specs.4.8.gz > specs.4.8.gz 
    稳妥的方法是切换到ruby china的国内源(注意taobao的源已经不再维护, 而且ruby-china后缀是com)
    1
    gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
  2. SSL问题, 这个需要更新相关的证书
  3. Debian系统
    如果
    1. 切换源的命令执行后, 依然无法正常切换 &&
    2. 或者直接修改~/.gemrc文件切换后 &&
    3. curl命令可以正常下载文件specs.4.8.gz &&
    4. 继续提示ERROR: While executing gem … (Gem::RemoteFetcher::UnknownHostError)timed out

那可能是Debian系统存在的问题, 如IPV6的设置, 可以参考如下信息

注: 博主是WSL2的Debian64bit的系统, 就碰到了原因3, 所以就直接换了Ubuntu, 按照教程重新安装, 所以并没有实际解决该问题.

Rails中Webpack相关的问题

由于Rails在创建新项目时默认使用Webpack, 所以会有很多Node模块需要在新建过程中安装. 而npm官方的源同样会在国内的网络环境下, 下载安装过程会有各式各样的问题.
所以首先设置国内的npm镜像源:

1
npm config set registry https://registry.npm.taobao.org

理论而言, 应该能rails new sample能正常创建项目了, 但是即便npm设置了taobao的镜像, 有很大的可能会在npm下载安装依赖包的时候卡住. 最为典型的就是卡在node-sass.

先说解决方案:
还需要特别设置sass的binding.node的下载地址

1
2
npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config ls -l // 查看配置信息, 可以检查下前面两步npm配置是否设置成功

具体的原因说明以及排查的过程

node-sass的问题也是坑过了无数前端, 首先它是编译Sass到css库libSass的node绑定, 使用非常广泛, 当前(2020.11.11)原项目团队已经转到dart-sass的开发, node-sass以后应该慢慢会弃用了, 它的安装过程具体分析可以参考此篇

它导致rails出现的问题如下:

  1. 在国内网络情况下, rails创建新项目过程中node-sass中的脚本无法正常拉取github中的文件, 导致需要本地长时间的building(需要python2等一系列依赖), 最后安装失败, 它虽然会报错, 但是也有可能并不会停下, 其它流程都一切正常.
  2. 流程走完, rails new执行报错: Error: Cannot find module ‘@rails/webpacker’, 之前安装未完成造成的;找不到webpack的命令.

另外只会在安装过程提示building node-sass以及失败信息, 但是如果你Ctrl+C 取消安装, 然后再重新安装. npm可能会由于node_module/node-sass的文件夹中已经存在相关文件, 以为已经安装成功而略过node-sass. 导致后续出错信息由于webpacker对webpack的封装, 并不再提示node-sass的错误信, 只会提示webpack出错.

node-sass由于TF-GFW的原因导致无法正常安装, 导致webpack安装出错, 导致webpacker出错, 导致新加Controller后无法被webpacker编译到public/packs中, 于是可能会出现如下错误:

  1. manifest为空的报错
  2. webpack命令找不到 : (error Command “webpack” not found.)
  3. webpack安装: yarn add webpack, 继续调试又会报错( Error: Cannot find module ‘webpack-cli’ ),并建议你安装webpack-cli ;
  4. webpack-cli安装: yarn add -D webpack-cli, 继续调试又会报错( Error: Cannot find module ‘@rails/webpacker’ );
    @rails/webpacker > node-sass > request@2.88.2: request has been deprecated

最后不得不吐槽, 这网络环境简直是在消磨技术热情, 尤其是各种工具,语言初学阶段, 如Docker, Gradle, Android. 熟手或许能轻而易举地发现并解决, 但是新手刚开始感兴趣去接触, 希望按照官网的教程开始新的旅程, 结果迎面就是一堵高墙, 墙面写着:

“Across the Great Wall, we can reach every corner in the world”.