Rails 关于 app/assets 和 vender/assets 以及 lib/assets, public/assets

1272729223 · 2014年02月04日 · 最后由 1272729223 回复于 2014年02月05日 · 4440 次阅读

现在有个问题

我想把前端和 rails 完全分离出来,因为我用前端的工具npmbower来管理 javascript 资源,然后用grunt去监听和预编译前端静态文件 (js,css).

rails 默认的结构:

.
├── app
│   ├── assets
│   │   ├── images
│   │   ├── javascripts
│   │   │   └── application.js
│   │   └── stylesheets
│   │       └── application.css
│   ├── controllers
│   ├── helpers
│   ├── mailers
│   ├── models
│   └── views
│       └── layouts
│           └── application.html.erb
├── bin
├── config
├── db
├── lib
│   ├── assets
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── tmp
├── vendor
│   └── assets
│       ├── javascripts
│       └── stylesheets
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
└── config.ru

我想把他们分离出来管理的结构:

.
├── app
│   ├── assets
│   │   ├── images
│   │   ├── javascripts
│   │   │   └── application.js
│   │   └── stylesheets
│   │       └── application.css
│   │   ├── node_modules/#在这里
│   │       └── grunt/
│   │       └── .../
│   │   ├── bower_components/#在这里
│   │       └── angular/
│   │       └── angular-route/
│   │   ├── Gruntfile.js#污染rails默认的app/assets结构
│   │   ├── package.json#污染rails默认的app/assets结构
│   │   ├── bower.json#污染rails默认的app/assets结构
│   ├── controllers
│   ├── helpers
│   ├── mailers
│   ├── models
│   └── views
│       └── layouts
│           └── application.html.erb
├── bin
├── config
├── db
├── lib
│   ├── assets
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── tmp
├── vendor
│   └── assets
│       ├── javascripts
│       └── stylesheets
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
└── config.ru

还是:

.
├── app
│   ├── assets
│   │   ├── images
│   │   ├── javascripts
│   │   │   └── application.js
│   │   └── stylesheets
│   │       └── application.css
│   ├── controllers
│   ├── helpers
│   ├── mailers
│   ├── models
│   └── views
│       └── layouts
│           └── application.html.erb
├── bin
├── config
├── db
├── lib
│   ├── assets
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── tmp
├── vendor
│   └── assets
│       ├── javascripts
│       └── stylesheets
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
└── config.ru
└── node_modules/#开始污染rails默认的根结构
└── bower_components/#污染rails默认的根结构
└── Gruntfile.js#污染rails默认的根结构
└── package.json#污染rails默认的根结构
└── bower.json#污染rails默认的根结构

还是???

粗略的看了一下 rails 的assets pipline中关于app/assetsvendor/assets, lib/assets, public/assets的使用情况。

现在我想用前端的工具来生成build之后的文件匹配到app/assets中,然后由 rails 的 assets pipline 去管理已经生成的文件,包括在生产环境去生成public/assets下面的文件。

可是这样,我不知道我该把node_modules/bower_components这样的文件夹放在哪里比较合适,我希望完全不要污染 rails 默认的任何结构。

这是基本思路:

第一步:

把rails默认的行为预先抽离出来,
用Grunt去监听javascript和stylesheet文件(我自己要先建一个src文件夹,存放开发环境中的js和css文件). 然后组合成一个文件application.js和application.css在`app/assets/javscripts/`以及`app/assets/stylesheets`文件夹下面.这样就和rails默认的行为不冲突了。

第二步:

由rails默认的assets pipline行为去管理`app/assets`下面由grunt预编译了的application.js和application.css文件。

第三步:

在生产环境由rails默认的行为去编译js和css文件。

#2 楼 @Peter 更新内容,多谢

用这些工具对比 Assets Pipeline 有什么优势?

#4 楼 @Rei 只是想把前端的部分更彻底的分离开来,然后 rails 只去写 api。

看你的第二步和第三步,你没有办法既用到 Rails 的功能,又脱离 Rails。

其实直接用 Asset Pipeline 没什么不好,版本管理也有,编译也有,环境变量也有,你还需要别的什么?

想要完全分离也不是不可以。完全用 Bower, grunt 等做一个静态网站就可以了,同时再用 Rails 做一个纯 api 服务器。然后静态网站直接呼叫 api。

既然要完全剥离开,为什么还非要放在 Rails 的项目路径下?单独做一个不就好了?

如果要分开就做 2 个 repo/project rails 只做 APIs,client side JS 放在另一个 project。管理 commits 也方便

#6 楼 @billy #7 楼 @nightire #8 楼 @galaxy_watcher

多谢。正是我想要的效果,我再琢磨琢磨。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号