You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apple M1 Mac+Colima环境下Rails cssbundling-rails无法监听文件变更

问题

在Apple M1 MacBook的Docker容器(通过Colima运行)中,cssbundling-rails仅在容器启动时编译SCSS文件,后续修改指定监听的SCSS文件不会触发重新编译。

详细信息

当前环境使用Foreman和Procfile管理cssbundling-rails与jsbundling-rails的监听进程,bin/dev在docker-compose文件中执行,其中JavaScript打包可正常监听并重新编译application.js。

Colima环境配置命令:

colima start --arch x86_64 --cpu 4 --memory 6 --disk
docker context use colima

已在Docker容器内成功执行命令:rails css:install:bootstrap

设备运行MacOS Monterey Version 12.6

package.json包含以下脚本:

"scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets",
    "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules"
  }

修改/app/assets/stylesheets/application.bootstrap.scss文件后无重新编译动作,仅在销毁并重启容器时才会重新编译CSS,终端无报错信息。

容器重启后的输出如下:

$ sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules --watch
$ Sass is watching for changes. Press Ctrl-C to stop

Gemfile

source "https://rubygems.org"

ruby "3.1.3"

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.0.4", ">= 7.0.4.3"

# The original asset pipeline for Rails
gem "sprockets-rails"

# Use sqlserver as the database for Active Record
gem "activerecord-sqlserver-adapter"

# Use the Puma web server
gem "puma", "~> 5.0"

# Use JavaScript with ESM import maps
#gem "importmap-rails"

gem "tiny_tds"

gem "jsbundling-rails"

# Build JSON APIs with ease
gem "jbuilder"

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ]

# Reduces boot times through caching; required in config/boot.rb
gem "bootsnap", require: false

gem "cssbundling-rails"


group :development, :test do
  # 调试Rails应用
  gem "debug", platforms: %i[ mri mingw x64_mingw ]
  gem "rspec-rails"
  gem "factory_bot_rails"
  gem "faker"
end

group :development do
  # 异常页面控制台
  gem "web-console"

  # 性能徽章
  # gem "rack-mini-profiler"

  # 加速命令执行
  # gem "spring"
end

group :test do
  # 系统测试
  gem "capybara"
  gem "selenium-webdriver"
  gem "webdrivers"
end

解决方法

1. 强制Sass使用轮询模式监听文件

在M1 Mac的x86模拟容器中,文件系统事件传递可能存在兼容性问题,给Sass命令添加--poll参数,强制定期检查文件变化:
修改package.json中的build:css脚本:

"build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules --watch --poll"

2. 检查Docker卷挂载配置

确保docker-compose.yml中宿主机目录挂载正确,使用delegated选项平衡同步及时性与性能:

services:
  web:
    volumes:
      - .:/app:delegated

避免使用只读或缓存挂载模式,确保容器能实时获取宿主机的文件变更。

3. 验证Procfile.dev配置

确认项目根目录的Procfile.dev中,CSS进程调用的是带--watch参数的脚本:

css: yarn build:css
js: yarn build --watch
web: bin/rails server -p 3000

重启bin/dev使配置生效。

4. 更新Sass到最新版本

旧版Sass可能存在容器环境下的监听bug,执行以下命令更新:

yarn add sass@latest

5. 调整Colima的文件共享模式

如果上述方法无效,尝试修改Colima的文件挂载协议,重启Colima时添加--mount-type 9p:

colima stop
colima start --arch x86_64 --cpu 4 --memory 6 --disk --mount-type 9p

9p协议对文件事件传递支持更好,适合解决跨架构容器的文件监听问题。


内容的提问来源于stack exchange,提问作者Joe Thor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:54:55