Hey Andrew,
I have always liked the automatic asset paths and thought they allowed the top level Rails applications as well as engine authors the ability to create namespaces via directories.
I read your whole email but kind of got lost. Is your main issue that creating a namespace via directories is a chore since it has to be done in 3 places?
Or a more concrete question. I am the author of the less-rails and the matching less-rails-bootstrap gems. I was very conscious about directory namespaces and made sure that my namespace for less-rails-bootstrap was "twitter/bootstrap". I am a firm believer that engines that deliver assets should follow this pattern. So the question, what would you suggest doing differently vs this setup?
https://github.com/metaskills/less-rails-bootstrap/tree/master/vendor/assets
- Ken
On Aug 4, 2012, at 12:50 PM, Andrew Vit wrote:
> In 2fe70c1 (last year), rails changed from a static list of assets.paths to automatically register any path under assets/*. (This was not reflected in Rails Guides so I pushed an update to docrails.)
>
> However, in my opinion, these automatic asset paths create confusion.
>
> The result is that the first-level directories under `(app|lib|vendor)/assets` get swallowed and if I put assets into a directory of my own naming, it will conflict with assets from another asset path. e.g.
>
> app/assets/images/icons/close.png
>
> vendor/assets/xyz/icons/close.png
>
> Here, the path segments "images" and "xyz" become asset path roots, so both of the above resolve as icons/close.png, and serve from /assets/icons/close.png. (If you didn't expect that, I should point out that the file from app will take precedence.)
>
> I don't know if I'm missing how this is expected to be used. I might expect app/assets/stylesheets, lib/assets/stylesheets, and vendor/assets/stylesheets to correspond and mask each other, but not a subdirectory of my own naming.
>
> Take for example a typical frontend widget I might want to download and install:
>
> foo/widget.js
> foo/styles.css
> foo/images/click.png
>
> If I want to keep this in a namespaced asset bundle instead of reorganizing it into separate javascripts/stylesheets/images directories, I can't just drop the folder into vendor/assets, as the asset paths will swallow the "foo" directory name, leaving the files naked in public/assets. In my manifests, these also automatically become available directly as "styles.css" and "widget.js" without a "foo/" prefix.
>
> I could arbitrarily put it into vendor/assets/javascripts/foo (or vendor/assets/whatever/foo), but that makes no sense: it's not all just javascripts, it's a whole package. Is it really the right solution to just nest things 2 levels down so as not to lose the subdirectory for namespacing?
>
> For vendor/assets packages, ideally I think the way to handle such packages is to define a "foo.js" and "foo.css" manifest to wrap the vendored package, and keep all its files scoped under its own directory, e.g.
>
> vendor/assets/foo.css # manifest file: //= require './foo/widget.css'
> vendor/assets/foo.js # manifest file: //= require './foo/widget.js'
> vendor/assets/foo/widget.js
> vendor/assets/foo/styles.css
> vendor/assets/foo/images/click.png
>
> (Alternately, the manifests could be index files inside the folder.)
>
> These would correspond to the public paths:
>
> /assets/foo/styles.css # not used directly when included through a manifest
> /assets/foo/widget.js # not used directly when included through a manifest
> /assets/foo/images/click.png
>
> This would make the package available in application.(css|js) as a simple "require foo"
>
> How best to configure rails for this? Should assets/(stylesheets|javascripts|images) be magically considered "global" or should the initializer for sub-paths under assets be dropped altogether, leaving it to the user to organize assets how they see fit?
>
> (Also, currently there's that somewhat confusing mismatch between app/assets and public/assets, where app/assets is organized into subdirectories for javascripts & stylesheets, and public is not -- defaulting to just assets as the config path instead of assets/* could fix that.)
>
> Are there any established usage patterns I'm missing, or should Rails consider something to organize this better by default?
>
> --
> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
> To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-core/-/dWp6EGpUJZUJ.
> To post to this group, send email to
rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to
rubyonrails-co...@googlegroups.com.
> For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en.
>