Rails 3.1 Asset pipeline i ręcznie zamawiany Javascript wymaga

Próbuję przekonwertować istniejącą aplikację na nowy układ potoku zasobów 3.1 i chcę dołączyć wiele plików dostawcy, które muszą być w określonej kolejności (podkreślenie.JS i kręgosłup będący jedną parą). W związku z tym nie mogę po prostu użyć = require_tree ., Aby pobrać pliki dostawcy (bez zmiany nazwy każdego pliku z prefiksem. Fuj).

Poniżej znajduje się mój plik app/assets/javascripts/application.js:

//= require modernizr-1.7
//= require jquery-1.6.1
//= require underscore-1.1.5
//= require backbone-0.3.3
//= require_tree .

Wypróbowałem każdą kombinację with / out extensions, z / out require_tree i z / out relative ścieżki i nic nie działa. Wszystkie moje pliki są w /vendor/assets/javascripts/.

Mam wrażenie, że jestem głupi, ponieważ wydaje się to tak oczywistym przypadkiem użycia, (w tym konkretnych plików po nazwie w kolejności jest wspólne z JS, nie? że muszę robić coś idiotycznego?

Author: New Alexandria, 2011-05-27

5 answers

Możesz zażądać KAŻDEGO pliku w określonej kolejności, a następnie dodać:

//= require_self

Zamiast:

//= require_tree .
 29
Author: martinciu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-25 21:25:32

Masz dwie możliwe struktury : pierwszą i drugą. W obu poniższych przykładach wystawiasz pakiet na /assets/externals.js. Możesz javascript_include_tag ten pakiet, ale możesz go również wymagać w swoim pliku application.js.

Pierwszy

vendor/
├── assets
│   ├── javascripts
│   │   ├── externals.js
│   │   ├── modernizr-1.7.js
│   │   └── underscore-1.1.6.js
│   └── stylesheets
└── plugins

Plik externals.js zawiera:

//= require ./underscore-1.1.6.js
//= require ./modernizr-1.7.js

Drugi

vendor/
├── assets
│   ├── javascripts
│   │   └── externals
│   │       ├── index.js
│   │       ├── modernizr-1.7.js
│   │       └── underscore-1.1.6.js
│   └── stylesheets
└── plugins

Plik index.js zawiera:

//= require ./underscore-1.1.6.js
//= require ./modernizr-1.7.js
 48
Author: Romain Tribes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-27 15:07:49

Moja odpowiedź dotyczy Rails 3.1rc4, Nie wiem czy działa tak samo z innymi wersjami.

Możesz umieścić wszystkie wymagane instrukcje w app/assets/javascripts / application.js czyPliki js znajdują się w app/assets/javascripts/ lub vendor/assets/javascripts/

Like so:

// this is in app/assets/javascripts/application.js

//= require modernizr-2.0
//= require jquery
//= require jquery_ujs
//= require jqueryui-1.8.12
//= require jquery.easing-1.3
//= require jquery.noisy
//= require jquery.jslide-1.0
//= require respond
//= require smoke
//= require_tree

Dodałem require_tree tutaj, ponieważ mam inne pliki javascript dla moich poszczególnych kontrolerów (pages.js.kawa, użytkownicy.js.Kawa) i ogólne dla całej witryny rzeczy (site.js.kawa)

Tymczasem oto struktura plików.

app/
├── assets
│   ├── javascripts
│   │   ├── application.js
│   │   ├── pages.js.coffee
│   │   ├── users.js.coffee
│   │   └── site.js.coffee
│   └── stylesheets
└── plugins

vendor/
├── assets
│   ├── javascripts
│   │   ├── jquery.easing-1.3.js
│   │   ├── jquery.jslide-1.0.js
│   │   ├── jquery.noisy.js
│   │   ├── jqueryui-1.8.12.js
│   │   ├── modernizr-2.0.js
│   │   ├── respond.js
│   │   └── smoke.js
│   └── stylesheets
└── plugins

To pozwala mi kontrolować kolejność ładowania bibliotek dostawcy (co ma duże znaczenie, Zwykle) i nie martwić się o mój wewnętrzny javascript, gdzie kolejność ma mniejsze znaczenie.

Co ważniejsze, kontroluję wszystkie polecenia require w jednym często używanym pliku, uważam, że zarówno bezpieczniejsze, jak i czystsze.

 8
Author: Olivier Lacan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 15:15:44

Wierzę, że możesz umieścić library.js w swoim in vendor/assets/javascripts, a następnie po prostu

//= require library.js

Z twojego application.js, nie?

 6
Author: muxcmux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-25 17:32:48

Require_tree robi dokładnie to, co mówisz. If you give it

//= require_tree .

Ładuje pliki w bieżącym katalogu, w którym wywoływane jest require_tree. If you give it

//=require_tree ../../../vendor/assets/javascripts

Wtedy dostaniesz javascript pod vendor.

Nie podobało mi się../../.. notacji, więc utworzyłem plik o nazwie vendor/assets/javascripts / vendor_application.js, który zawiera:
//= require_tree .

, który ładuje javascript w katalogu dostawcy.

Uwaga, Wymaga przeszukania 3 lokalizacje potoków (app, lib, vendor) dla pliku, który ma być wymagany. require_tree jest dosłowne, co prawdopodobnie jest takie, jakie powinno być.

Railscast na tym jest bardzo pomocny: http://railscasts.com/episodes/279-understanding-the-asset-pipeline

 4
Author: justingordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-31 08:28:52