Railsのwebpacker:install実行で、ArgumentError: Malformed version number string 0.32+git 発生
Docker環境でRailsプロジェクトを新規で作ろうとしたときにwebpacker:install表題のエラーで失敗して、少々ハマった。
いろいろググってみるとwebpackをインストールする際に使うyarnのバージョン不整合が起きてるのが原因の模様。
yarnを事前にインストールするよう、Dockerfileを修正。
変更前
RUN apt-get update -qq \ && apt-get install -y nodejs default-mysql-client
変更後
RUN apt-get update -qq \ && apt-get install -y curl apt-transport-https wget \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update && apt-get install -y yarn \ && apt-get install -y nodejs default-mysql-client
修正後、rails webpacker:install
を再実行すればOK
Docker環境でのRailsプロジェクト セットアップ
概要
Docker環境でゼロからRailsプロジェクトセットアップするのが初めてだったので、作業メモ。
前提
諸々のバージョンが少し古いが公式の情報を使おうということで、このページを参考に。
- Railsの開発環境の稼働、及びテストは全てDocker環境で行う。
- DockerfileやGemfileは全てプロジェクトディレクトリ直下におく。
- DBはPostgreSQLじゃなく、MySQLを使う。
- rubyのバージョンは2.6系、Railsのバージョンは6系。
初期ファイル作成
以下のファイルを全てプロジェクトディレクトリ直下に作る。
- Dockerfile(yarnのバージョンの不整合がおきて、webpackerがうまく動かない現象が起きるので、その辺りを修正してある。)
Dockerfile FROM ruby:2.6.6 RUN apt-get update -qq \ && apt-get install -y curl apt-transport-https wget \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update && apt-get install -y yarn \ && apt-get install -y nodejs default-mysql-client WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN bundle install COPY . /app # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]
- Gemfile
source 'https://rubygems.org' gem 'rails','~>6'
空のGemfile.lock。touchするだけ。
entrypoint.sh
#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /app/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"
- docker-compose.yml
version: '3.7' services: db: image: mysql:8.0.20 environment: MYSQL_ROOT_PASSWORD: password ports: - '3306:3306' command: --default-authentication-plugin=mysql_native_password volumes: - ./tmp/db:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/app ports: - "3000:3000" depends_on: - db
Docker ビルド実行 & Rails プロジェクト作成
以下のコマンドを叩く。なお、今回はcoffee script, turbolinksは無効にするので、そのオプションもつける。
% docker-compose run web rails new . --force --no-deps --database=mysql --skip-coffee --skip-turbolinks
Docker再ビルド
このタイミングでGemfileが書き換わるので、再ビルド
% docker-compose build
DBの接続、作成
- config/database.ymlの修正
変更前
default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: localhost
変更後
default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password host: db
- DBの作成
% docker-compose run web rails db:create
起動
% docker-compose up
確認
http://localhost:3000/ にアクセスすれば、「Yay! You're on Rails!」画面が確認できる。
link_to_if, link_to_unlessで括弧を使ったときの空白有無で挙動が違う件
link_to_unlessが括弧の前に空白があるかどうかで挙動が変わってしまう。
こちらだと正常
<%= link_to_unless(true, "a", "b") %>
括弧の前に空白をつけるとSyntaxErrorが発生。
<%= link_to_unless (true, "a", "b") %>
link_to_ifでも同様だった。
条件式が第1引数に来るヘルパーだと、こういう挙動になるのだろうか…?
理由がわからないのが気持ち悪いが、とりあえずハマったのでメモ。
追記:
rubyの言語仕様的に的にメソッド名の後ろにカッコをつける場合、空白を入れてはダメらしい...。 知らなかった…恥ずかしい。
2段階認証済みのアカウントでgithubのprivate repositoryをcloneする方法
前提
- プライベートの開発用のgithubのprivate repositoryをcloneしようとしたら、普通のID・パスワードではcloneできず、少しハマったのでメモ
対応
この「2FA設定済」のところが答え。
New personal access token を repo にチェック入れて作成して、パスワードにそのトークンを入れればOK。
自分はghqを使っているが、同様の対応でできた。
% ghq get https://user_name@github.com/user_name/repository_name.git clone https://user_name@github.com/user_name/repository_name.git -> /Users/sei/src/github.com/ user_name/repository_name git clone --recursive https://user_name@github.com/user_name/repository_name.git /Users/sei/ src/github.com/user_name/repository_name Cloning into '/Users/sei/src/github.com/user_name/repository_name'... Password for 'https://user_name@github.com': remote: Enumerating objects: 339, done. remote: Counting objects: 100% (339/339), done. remote: Compressing objects: 100% (215/215), done. remote: Total 339 (delta 81), reused 336 (delta 78), pack-reused 0 Receiving objects: 100% (339/339), 184.25 KiB | 570.00 KiB/s, done. Resolving deltas: 100% (81/81), done.
Rails再勉強中
10数年ぶりのRailsなので、Railsを勉強しなおしている。
Ruby on Rails 6 実践ガイド (impress top gear)
- 作者:努, 黒田
- 発売日: 2019/12/20
- メディア: 単行本(ソフトカバー)
まだ1/3くらいしか進んでないが、最新のRailsに対応しているのと、型通りのマニュアルじゃなくて、 ちゃんと実践的な内容になっているのでとても良い。
ビジネスロジックの分け方とか、簡単ではあるがsassの書き方など、網羅性が高い。 個人的にはDockerをちゃんと使いながら学べるのがありがたかった。
- 作者:黒田 努
- 発売日: 2020/05/22
- メディア: 単行本(ソフトカバー)
こちらも予約した。
今月中には両方とも終わらせたい。
Rails ジョブキューのライブラリ検討
メールの送信はバックグラウンドで行いたい。そのため、ジョブキューを使う。
Amazon SQSを使おうとも考えたがせっかくだし、Active Jobを使いたいとも思うとSyurikenしか選択肢がない。Workerを書くのが大変そうだし、更新が滞っている感じがしてちょっと微妙。どうせキャッシュとセッションでRedisを使うので、Redisをキューに使えるライブラリを探した。
SidekiqとRescueが候補になったが、結果、まずはSidekiqで検証を行ってみようと思う。理由は以下。
- Rescueは更新がやや止まっていて不安がある反面、Sidekiqは有償のPro版があることもあり更新頻度が高い。
- バッチ処理を作る際にSidekiq-Cronが使えそう。
- SidekiqはPro版があり、機能も制限されていてどこまで使えるのかはっきりわからないが、今回はまずはメール配信をバックグラウンドに逃すだけなのでそこまで大変なことするわけでもない。
Sidekiqを使ったキューの実装検証はまた後日。
Rubocopセットアップ
前提
あとで大変なことにならないよう、今のうちからRubocopを入れておく
セットアップ
rubocop.ymlの作成
とりあえず適当に、下記からファイルを持ってくる。
Gemfileに以下を追加
group :development do ... gem 'rubocop', require: false gem 'rubocop-rails' .. end
再ビルド
% docker-compose run web bundle update % docker-compose build
rubocop.ymlの修正
ymlの内容が古いため、このままだとエラーで動かないので修正。
変更前
# Railsのチェックを有効にする Rails: Enabled: true
変更後
# Railsのチェックを有効にする require: rubocop-rails
次の箇所は削除
# hashをメソッドの引数にするときに{}を省略できるけど、書いてもいい設定 Style/BracesAroundHashParameters: Enabled: false
実行
% docker-compose run --rm web rubocop Starting rails-sample_db_1 ... done /app/.rubocop.yml: Warning: no department given for AsciiComments. /app/.rubocop.yml: Warning: no department given for ClassAndModuleChildren. /app/.rubocop.yml: Warning: no department given for AccessorMethodName. /app/.rubocop.yml: Warning: no department given for AndOr. /app/.rubocop.yml: Warning: no department given for LineLength. The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file: - Layout/EmptyLinesAroundAttributeAccessor (0.83) - Layout/SpaceAroundMethodCallOperator (0.82) - Lint/RaiseException (0.81) - Lint/StructNewOverride (0.81) - Style/ExponentialNotation (0.82) - Style/HashEachMethods (0.80) - Style/HashTransformKeys (0.80) - Style/HashTransformValues (0.80) - Style/SlicingWithRange (0.83) For more information: https://docs.rubocop.org/en/latest/versioning/ Inspecting 2 files .. 2 files inspected, no offenses detected
rubocop.ymlの内容の調整はしたほうが良さそうだが、一旦動いた。