the even darker art of rails engines

96
The Even-Darker Art of Rails Engines

Upload: lazyatom

Post on 12-Jul-2015

1.935 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: The Even Darker Art Of Rails Engines

The

Even-Darker Artof

Rails Engines

Page 2: The Even Darker Art Of Rails Engines

@lazyatom

Page 3: The Even Darker Art Of Rails Engines

github.com/lazyatom/engines

Page 4: The Even Darker Art Of Rails Engines

Rails 2.3

Page 5: The Even Darker Art Of Rails Engines

history

Page 6: The Even Darker Art Of Rails Engines

November 2005

Page 7: The Even Darker Art Of Rails Engines

it’s distracting!

Page 8: The Even Darker Art Of Rails Engines

reuse is overrated!

Page 9: The Even Darker Art Of Rails Engines

Evil!Evil!

Evil!Evil!

Evil!Evil!

Evil!

Evil!Shit!

Page 10: The Even Darker Art Of Rails Engines

eek!

Page 11: The Even Darker Art Of Rails Engines

appable_plugins

Page 12: The Even Darker Art Of Rails Engines

desert

Page 13: The Even Darker Art Of Rails Engines

merb slices?

Page 14: The Even Darker Art Of Rails Engines
Page 15: The Even Darker Art Of Rails Engines

engines

Page 16: The Even Darker Art Of Rails 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!

Page 17: The Even Darker Art Of Rails Engines

app/controllers/models/helpers/views/metal/

Page 18: The Even Darker Art Of Rails Engines

*$+,#-&"**&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!

Page 19: The Even Darker Art Of Rails Engines

9"-7"1$J%--won’t load from your plugin

Page 20: The Even Darker Art Of Rails Engines

Ticket #1905

Page 21: The Even Darker Art Of Rails Engines

config/routes.rb

Page 22: The Even Darker Art Of Rails Engines

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+'(%.!)

Page 23: The Even Darker Art Of Rails Engines

top precedence

Page 24: The Even Darker Art Of Rails Engines

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:

Page 25: The Even Darker Art Of Rails Engines

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:

Page 26: The Even Darker Art Of Rails Engines

Ticket #2592(also Ticket #329)

Page 27: The Even Darker Art Of Rails Engines

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!

Page 28: The Even Darker Art Of Rails Engines

what’s missing?

Page 29: The Even Darker Art Of Rails Engines

public assets

Page 30: The Even Darker Art Of Rails Engines

copy

Page 31: The Even Darker Art Of Rails Engines

file clash

Page 32: The Even Darker Art Of Rails Engines

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!

Page 33: The Even Darker Art Of Rails Engines

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)>

Page 34: The Even Darker Art Of Rails Engines

migrations

Page 35: The Even Darker Art Of Rails Engines

simple DSL

Page 36: The Even Darker Art Of Rails Engines

rollback

Page 37: The Even Darker Art Of Rails Engines

!&:2/51%)":$$VWWXWYWYYVYVZ[.%-79%=1&

version

20090101121234

20090102142345

2008123123456

VWWXWYWVY[VZ[\.&")%=1&

7-(5/0:!&:2/51%)":$$VWW]YVZYZ[\^.5%22%=1&

Page 38: The Even Darker Art Of Rails Engines

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)

Page 39: The Even Darker Art Of Rails Engines

it gets worse

Page 40: The Even Darker Art Of Rails Engines

!&:2/51%)":$$WWY.%-79%=1&

version

001

002

WWV.&")%=1&

7-(5/0:!&:2/51%)":$$WWY.5%22%=1&

Page 42: The Even Darker Art Of Rails Engines

single timeline

Page 43: The Even Darker Art Of Rails Engines

app migration 1

app migration 2

plugin migration 1

app migration 3

plugin migration 2

install

upgrade

You

Me

Page 44: The Even Darker Art Of Rails Engines

app migration 1

app migration 2

plugin migration 1

app migration 3

plugin migration 2

You

Page 45: The Even Darker Art Of Rails Engines

WW[.!"-)%=1&

!&:2/51%)":$$WWY.%-79%=1&

WWV.&")%=1&

7-(5/0:!&:2/51%)":$$WWY.5%22%=1&

WWZ.7-(5/0.)'.WWY=1&

Page 46: The Even Darker Art Of Rails Engines

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?

Page 47: The Even Darker Art Of Rails Engines

Ticket #2058interblah.net/plugin-migrations

Page 48: The Even Darker Art Of Rails Engines

my recommendation?(for the moment, at least)

Page 49: The Even Darker Art Of Rails Engines

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)

Page 50: The Even Darker Art Of Rails Engines

techniques

Page 51: The Even Darker Art Of Rails Engines

overriding functionality

Page 52: The Even Darker Art Of Rails Engines

views just work

Page 53: The Even Darker Art Of Rails Engines

controllers

Page 54: The Even Darker Art Of Rails Engines

straight override

Page 55: The Even Darker Art Of Rails Engines
Page 56: The Even Darker Art Of Rails Engines
Page 57: The Even Darker Art Of Rails Engines

module

Page 58: The Even Darker Art Of Rails Engines
Page 59: The Even Darker Art Of Rails Engines
Page 60: The Even Darker Art Of Rails Engines
Page 61: The Even Darker Art Of Rails Engines

namespaced

Page 62: The Even Darker Art Of Rails Engines
Page 63: The Even Darker Art Of Rails Engines
Page 64: The Even Darker Art Of Rails Engines
Page 65: The Even Darker Art Of Rails Engines

playing nice with the class cache

Page 66: The Even Darker Art Of Rails Engines

1/23*8/36/1**$#2"'#3-43-'!3$$(!/

9"%/)((-/!(73:(;/6!37/'9(/73;+$(/

'!((/)+'/#%/%'#$$/"2'#:(<<<<<<<<!

Page 67: The Even Darker Art Of Rails Engines

O;)/D"_(77'1)JJe"7"0!"0;/"6=-'%!.'0;".7%)96

Page 68: The Even Darker Art Of Rails Engines

ApplicationController

AppController PluginController

Page 69: The Even Darker Art Of Rails Engines

ApplicationController

PluginController

Page 70: The Even Darker Art Of Rails Engines

23-6#,&(-:#!3-7(-'.!)

?%/-6JJQ0/)/%-/f"1=1(0$!'$+;'0#/5+$$3$");===

$$;'0#/5=1"-'%!.7-(5/06$,$)1("$$"0!

Page 71: The Even Darker Art Of Rails Engines

83+!5*$+,#-&"**&23-'!3$$(!%&,33;523-'!3$$(!.!)

;-%66$g''!I'0)1'--"1$h$===$$(0-'%!%&-"$$$$3$");$===

"0!

Page 72: The Even Darker Art Of Rails Engines

init.rb woes

Page 73: The Even Darker Art Of Rails Engines

;'0#/5=)'.71"7%1"$!'

$$"0!

785*$+,#-&#-#'.!)

$$_'2"O77I-%66="A)"0!BP<i"9%D/'(1C

Page 74: The Even Darker Art Of Rails Engines

testing

Page 75: The Even Darker Art Of Rails Engines

ApplicationController

PluginControllerAppController

Page 76: The Even Darker Art Of Rails Engines

ApplicationController

PluginController

Their Code

Your Code

Page 77: The Even Darker Art Of Rails Engines
Page 78: The Even Darker Art Of Rails Engines

!"

#$

Page 79: The Even Darker Art Of Rails Engines
Page 80: The Even Darker Art Of Rails Engines

unit test?

Page 81: The Even Darker Art Of Rails Engines

test in your own rails environment?

Page 82: The Even Darker Art Of Rails Engines

plugin_test_helper

Page 83: The Even Darker Art Of Rails Engines

I care about testing my chunk

Page 84: The Even Darker Art Of Rails Engines

You care about testing your whole app

Page 85: The Even Darker Art Of Rails Engines

empower the developer

Page 86: The Even Darker Art Of Rails Engines

avoiding fail

Page 87: The Even Darker Art Of Rails Engines

;%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!

Page 88: The Even Darker Art Of Rails Engines

consume wisely

Page 89: The Even Darker Art Of Rails Engines

Serving Size 14 klocNutrition 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%

Page 90: The Even Darker Art Of Rails Engines

you will not be able to write some engines.

Page 91: The Even Darker Art Of Rails Engines

you will not be able to use some engines.

Page 92: The Even Darker Art Of Rails Engines

extractspecific functionality

Page 93: The Even Darker Art Of Rails Engines

establish someclear integration points

Page 94: The Even Darker Art Of Rails Engines

you are customer #1

Page 95: The Even Darker Art Of Rails Engines

READ the CODE