Как да вкарам моя ruby ​​източник в пътя на зареждане при извикване с thin?

Играя си с комбинация от Thin, Sinatra и Bundler. Опитвам се да разбера как да накарам Thin да включи пътя към моя изходен код в пътя за зареждане? Потърсих уводни ръководства за тази настройка, но никой от тях изглежда не отговаря на въпроса ми.

Бъркането с rackup файла или тънкия конфигурационен файл се чувства погрешно. Да приемем, че имам структура на директория с нещо като:

bin/my-application-entry.rb # The entry point to my sinatra application
lib/myapp/mylibs.rb
thin/config.ru # rackup config
thin/dev.yaml  # thin config
Gemfile        # for my dependencies

Съдържанието на rackup файла е по същество

require 'sinatra'
# I'd like to require 'my-application-entry' around here somewhere (I think?)
run Sinatra.application

Извиквам приложението с

thin -C thin/dev.yaml -R thin/config.ru start

Забелязах, че thin взема аргумент от командния ред, за да изисква конкретна библиотека, но със сигурност има по-добро място, където можете да дефинирате всички пътища за зареждане?

Въпросът ми наистина е как да кажа на thin/rack/bundler кои директории да включа? (като bin/ и lib/)

Редактиране: За по-голяма яснота, наистина бих искал да знам как обикновено се прави това с Thin конкретно. Не съм склонен да модифицирам $: в моето основно приложение, но ако съм принуден да използвам $:, къде е най-доброто място (в контекст на Thin/Rack/Sinatra) да го направя?


person jabalsad    schedule 21.06.2012    source източник


Отговори (2)


$: е глобална променлива, описваща пътя на зареждане, представена като масив. Можете да добавите ".", след което, ако ви е грижа, елиминирайте дубликатите, както следва:

$:.unshift(".").uniq!

Или можете да го натиснете до края на списъка:

$:.push(".").uniq!

Често се пропуска по подразбиране, защото представлява потенциална опасност за сигурността.

person djconnel    schedule 21.06.2012
comment
Наясно съм с техническите подробности за добавяне на необходимите директории към вашия път за зареждане, благодаря :-) Въпросът ми беше по-насочен от гледна точка на дизайна: къде е правилното място да направите това? Като цяло се чувствам неудобно да бъркам с $: в изходния код, освен ако няма по-добър начин. Например, в приложенията, които пиша, пътят на зареждане е настроен, преди процесът ruby ​​да се изпълни и след това да се предаде чрез ruby -I. Не казвам, че това е правилният подход, но в този случай е по-чист от бъркането с $: тъй като осигурява ясно отделяне на средата от приложението. - person jabalsad; 22.06.2012

И аз се чудя същото. Ще ви кажа какво правя и ще се опитам да го оправдая. Може би в процеса на писане на това ще съм разбрал нещо.

Реших засега да добавя към $LOAD_PATH в config.ru, защото използвам config.ru като входна точка на моето приложение. Мога да се размина с това, защото възнамерявам да оставя този файл в корена на проекта. Не ми харесва да правя това предположение, но засега изглежда доста безопасно. Разбира се, ще оставя коментар, който гласи „Ау. Предполага се, че този файл е единствената входна точка на приложението и че винаги ще бъде в корена на проекта.“

Избрах това, защото искам да добавя към $LOAD_PATH възможно най-високо в стека на извикванията (Принцип на инверсия на зависимостта), но правя това в командите, които изпълняват приложението (Procfile изпълнява thin в производство; команден ред изпълнява shotgun в разработка) дублира директориите, които искам да добавя към пътя за зареждане. Класифицирам ли това дублиране като съществено (заслужава си да се премахне) или случайно (заслужава си да се дублира)? Засега изглежда като основен аспект на приложението, поне както реших да го организирам, защото приложението интегрира различните услуги в един двигател за заявка/отговор/маршрутизиране. Освен това config.ru описва приложението, така че има смисъл да го третираме като приложението.

Ако ситуацията се промени и забележа, че искам различен $LOAD_PATH в разработката от този в производството, тогава ще преместя директориите нагоре в стека за извикване в командата, която изпълнява config.ru.

Чувствам се комфортно с този избор, не защото го смятам за „правилния избор“, а защото мисля, че знам как и защо бих променил решението си. Достатъчно добър за мен.

Надявам се това да помогне.

person J. B. Rainsberger    schedule 21.04.2014