Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The Even Darker Art of Rails Engines
Search
lazyatom
May 05, 2009
Programming
1
640
The Even Darker Art of Rails Engines
Given at RailsConf 2009
lazyatom
May 05, 2009
Tweet
Share
More Decks by lazyatom
See All by lazyatom
Here's to the crazy ones
lazyatom
1
880
Why is nobody using Refinements?
lazyatom
0
1.3k
Deploying Rails with Docker
lazyatom
5
800
IoT Printer
lazyatom
0
480
Do we need any more test frameworks?
lazyatom
0
86
Gem That (2009)
lazyatom
0
490
The Dark Art of Rails Plugins
lazyatom
0
510
Extending Rails with Plugins (2007)
lazyatom
0
320
Engines: Team Development on Rails
lazyatom
0
620
Other Decks in Programming
See All in Programming
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.3k
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
320
SourceGeneratorのマーカー属性問題について
htkym
0
220
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
190
20260315 AWSなんもわからん🥲
chiilog
2
170
AI活用のコスパを最大化する方法
ochtum
0
320
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
2
390
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
440
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
150
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
990
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
550
CSC307 Lecture 15
javiergs
PRO
0
260
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
85
Marketing to machines
jonoalderson
1
5k
Navigating Team Friction
lara
192
16k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
140
Accessibility Awareness
sabderemane
0
84
The Invisible Side of Design
smashingmag
302
51k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
GraphQLとの向き合い方2022年版
quramy
50
14k
Designing for humans not robots
tammielis
254
26k
Transcript
The Even-Darker Art of Rails Engines
@lazyatom
github.com/lazyatom/engines
Rails 2.3
history
November 2005
it’s distracting!
reuse is overrated!
Evil! Evil! Evil! Evil! Evil! Evil! Evil! Evil! Shit!
eek!
appable_plugins
desert
merb slices?
None
engines
!"#$%&!"#$'#(%&$#)&!"#$%&*$+,#-.!) !"#$%&'() $$*%&'()$++,$-'%!.%&'()./0#'12%)/'0 "0! 3$405/0"6$%1"$7-(5/06$8/)9$%0$%77:$!/1";)'1<= !"#$"05/0"> $$9%6.%77.!/1";)'1<> "0! 3$?")(106$)1("$/#$)9"$"05/0"$69/76$8/)9$%$1'()/05$#/-" !"#$1'()"!>
$$@/-"="A/6)>B1'()/05.#/-"C "0! !"#$D/"8.7%)9 $$@/-"=E'/0B!/1";)'1<F$G%77GF$GD/"86GC "0!
app/controllers/ models/ helpers/ views/ metal/
*$+,#-&"**&23-'!3$$(!&*$+,#-523-'!3$$(!.!) ;-%66$H-(5/0I'0)1'--"1/0/1**$#2"'#3-43-'!3$$(! $$!"#$/0!"A $$$$1"0!"1$J)"A)$,K$LM"--'F$H-(5/0NL $$"0! "0!
9"-7"1$J%-- won’t load from your plugin
Ticket #1905
config/routes.rb
O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+ $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L7-(5/0LF$ $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL "0! *$+,#-&23-6#,&!3+'(%.!)
top precedence
O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+ $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L7-(5/0LF$ $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL "0! O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+ $$3$===$')9"1$1'()"6$=== $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L%77LF$ $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL $$3$===$')9"1$1'()"6$=== "0!
in your plugin: in your app:
O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+ $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L7-(5/0LF$ $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL "0! O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+ $$3$===$')9"1$1'()"6$=== $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L%77LF$ $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL $$3$===$')9"1$1'()"6$=== "0!
in your plugin: in your app:
Ticket #2592 (also Ticket #329)
785*$+,#-&$#)&785*$+,#-.!) 2'!(-"$P<H-(5/0 $$!"#$6"-#=%!!.1'()"6B7"*C $$$$2%7=;'00";)$L:6)(##LF$J;'0)1'--"1$,K$L)9/056L $$"0! "0! O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+ $$3$<'(1$%77$1'()"6=== $$P<H-(5/0=%!!.1'()"6B2%7C $$3$");===
"0!
what’s missing?
public assets
copy
file clash
83+!5*$+,#-&#-%'"$$.!) 2<./2%5"6$,$H%)90%2"=0"8B@/-"=!/10%2"
[email protected]
$S$ $$$$$$$$$$$$$$L%66")6:/2%5"6L )%15")$,$?%/-6=1'')$S$L7(&-/;:/2%5"6:2<.7-(5/0L @/-"T)/-6=2U!/1.7B)%15")C 2<./2%5"6=;9/-!1"0="%;9$!'$+"+$ $$$$@/-"T)/-6=;7.1B"F$)%15")$S$"=&%6"0%2"C$ "0!
83+!5*$+,#-&#-%'"$$.!) 2<./2%5"6$,$H%)90%2"=0"8B@/-"=!/10%2"
[email protected]
$S$ $$$$$$$$$$$$$$L%66")6:/2%5"6L )%15")$,$?%/-6=1'')$S$L7(&-/;:/2%5"6:2<.7-(5/0L )%15")=2%U".6<2-/0UB2<./2%5"6C$(0-"66$)%15")="A/6)>
migrations
simple DSL
rollback
!&:2/51%)": $$VWWXWYWYYVYVZ[.%-79%=1& version 20090101121234 20090102142345 2008123123456 VWWXWYWVY[VZ[\.&")%=1& 7-(5/0:!&:2/51%)": $$VWW]YVZYZ[\^.5%22%=1&
version 20090101121234 20090102142345 2008123123456 1%U"$!&J1'--&%;U P/51%)'1=1'--&%;U P/51%)'13;(11"0).D"16/'0 P/51%)'132/51%)"!=-%6) P/51%)'1=5").%--.D"16/'06 BL_4R4I`$D"16/'0$@?aP$
$ $ $$6;9"2%.2/51%)/'06LC =2%7BbJ)'./C=6'1)
it gets worse
!&:2/51%)": $$WWY.%-79%=1& version 001 002 WWV.&")%=1& 7-(5/0:!&:2/51%)": $$WWY.5%22%=1&
http://www.flickr.com/photos/bk2204/475332962/
single timeline
app migration 1 app migration 2 plugin migration 1 app
migration 3 plugin migra install upgrade You Me
app migration 1 app migration 2 plugin migration 1 app
migration 3 plugin migration 2 You
WW[.!"-)%=1& !&:2/51%)": $$WWY.%-79%=1& WWV.&")%=1& 7-(5/0:!&:2/51%)": $$WWY.5%22%=1& WWZ.7-(5/0.)'.WWY=1&
WW[.!"-)%=1& !&:2/51%)": $$WWY.%-79%=1& WWV.&")%=1& 7-(5/0:!&:2/51%)": $$WWY.5%22%=1& WWZ.7-(5/0.)'.WWY=1& Copy & Retimestamp?
Reference? Symlink?
Ticket #2058 interblah.net/plugin-migrations
my recommendation? (for the moment, at least)
write a generator c$6;1/7):5"0"1%)"$%;)6.%6.#(.2/51%)/'06 $$$$ $$$"A/6)6$$!&:2/51%)" $$$;1"%)"$$!&:2/51%)":VWWXW\W\YYYZZd.&-%9=1& c$=== (within your
plugin)
techniques
overriding functionality
views just work
controllers
straight override
None
None
module
None
None
None
namespaced
None
None
None
playing nice with the class cache
1/23*8/36/1**$#2"'#3-43-'!3$$(!/ 9"%/)((-/!(73:(;/6!37/'9(/73;+$(/ '!((/)+'/#%/%'#$$/"2'#:(<< < < < < < < !
O;)/D"_(77'1)JJe"7"0!"0;/"6=-'%!.'0;".7%)96
ApplicationController AppController PluginController
ApplicationController PluginController
23-6#,&(-:#!3-7(-'.!) ?%/-6JJQ0/)/%-/f"1=1(0$!'$+;'0#/5+ $$3$");=== $$;'0#/5=1"-'%!.7-(5/06$,$)1(" $$ "0!
83+!5*$+,#-&"**&23-'!3$$(!%&,33;523-'!3$$(!.!) ;-%66$g''!I'0)1'--"1$h$=== $$(0-'%!%&-" $$ $$3$");$=== "0!
init.rb woes
;'0#/5=)'.71"7%1"$!' $$ "0! 785*$+,#-&#-#'.!) $$_'2"O77I-%66="A)"0!BP<i"9%D/'(1C
testing
ApplicationController PluginController AppController
ApplicationController PluginController Their Code Your Code
None
! " # $
None
unit test?
test in your own rails environment?
plugin_test_helper
I care about testing my chunk
You care about testing your whole app
empower the developer
avoiding fail
;%6"$;'!"=;'06(2"1 $$89"0$;'!"=%()9'1 $$$$1"(6"=2'6)-<$,j$:"##";)/D": $$89"0$1%0!B!"D"-'7"1C $$$$1"(6"=)1/;U/"1.&().7'66/&-"B)1("C $$"-6" $$$$1"(6"='D"11%)"!N "0!
consume wisely
Serving Size 14 kloc Nutrition Facts Amount Per Serving 1
bad engine Calories 10,666 Long Methods 1578g 34% God Objects 326g 7% Stress 320mg 119% Total Fat 2674g 98% Hairloss 45g 45.8% % Daily Value* Technical Debt 13g 87% Untested Code 1578mg 34% Hidden Bugs 326mg 7% Benefit 1mg 0.1%
you will not be able to write some engines.
you will not be able to use some engines.
extract specific functionality
establish some clear integration points
you are customer #1
READ the CODE
[email protected]
[email protected]
FIN