Top Banner
The Even-Darker Art of Rails Engines
96

The Even Darker Art Of Rails Engines

Jul 12, 2015

Download

Technology

lazyatom
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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