ࣗݾհ
w େೳ࢙BLBJEPOL
w ͯͳͱ͍͏ձࣾͰɺ1FSMΛॻ͍͍ͯ·͢ɻ
ژ͔Βདྷ·ͨ͠
w ࠓͷ݄·Ͱલ৬Ͱ3VCZΛॻ͍͍ͯ·ͨ͠ɻ
3VCZྺ͙Β͍
Slide 3
Slide 3 text
લճͷϥʂ
Slide 4
Slide 4 text
1FSM͍ͷࠃͷ3VCZJTU
w
Slide 5
Slide 5 text
1FSM͔Β3VCZ
w
Slide 6
Slide 6 text
ࠓͷ
Slide 7
Slide 7 text
DQBOpMFΛ
requires 'Plack';
...
on test => sub {
requires 'Test2', '1.302138';
...
}
Slide 8
Slide 8 text
DQBOpMFΛ3VCZͰʜʜʁ
$ ruby -cw cpanfile
Syntax OK
Slide 9
Slide 9 text
͍ͭ͜ʜʜಈͧ͘ʜʜʂ
Slide 10
Slide 10 text
ͱ͍͏Ͱ͢
w ΑΖ͓͘͠ئ͍͠·͢
Slide 11
Slide 11 text
DQBOpMFͱ
Slide 12
Slide 12 text
DQBOpMFͱ
w ϓϩδΣΫτͰ͏$1"/ϞδϡʔϧͷҰཡΛॻ͘ͷ
w 3VCZͰ͍͏(FNpMF HFNpMFSC
Slide 13
Slide 13 text
DQBOpMFͷTZOUBY
# requires Ͱ ͍͍ͨ CPAN Module ΛฒΔ
requires 'Plack';
...
# ಛఆͷ env ͰͷΈ͍͍ͨͷ on Ͱ sub Λ͢
on test => sub {
# ୈ2ҾͰόʔδϣϯݻఆ͍ͯ͠Δ߹͋Δ
requires 'Test2', '1.302138';
...
}
Slide 14
Slide 14 text
DQBOpMFͷTZOUBY
w 3VCZతʹ͜ͷDQBOpMFͲͷΑ͏ʹύʔε͞ΕΔ͔
w ৄ͘͠SVCZEVNQQBSTFUSFFDQBOpMFΛ࣮ߦ
Slide 15
Slide 15 text
DQBOpMFͷTZOUBYJO3VCZ
w ͜ͷߦ3VCZͰಈ͘͜ͱ͕໌ന
w SFRVJSFTϝιουʹจࣈྻͷҾΛ͍ͯ͠Δ
w ߦͷηϛίϩϯ͕͋ͬͯͳ͍
requires 'Plack';
Slide 16
Slide 16 text
DQBOpMFͷTZOUBYJO3VCZ
w ίον
w ͜ΕΛ͏ͪΐͬͱ͚ͩΧοίΛิ͢Δͱ
on test => sub {
requires 'Test2', '1.302138';
}
Slide 17
Slide 17 text
DQBOpMFͷTZOUBYJO3VCZ
w ίον
w ͜ΕΛ͏ͪΐͬͱ͚ͩΧοίΛิ͢Δͱ
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 18
Slide 18 text
DQBOpMFͷTZOUBYJO3VCZ
w POϝιουʹϋογϡΛ͍ͯ͠Δ
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 19
Slide 19 text
DQBOpMFͷTZOUBYJO3VCZ
w ϋογϡͷΩʔUFTUϝιου
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 20
Slide 20 text
DQBOpMFͷTZOUBYJO3VCZ
w ϋογϡͷΩʔUFTUϝιου
w ϋογϡͷόϦϡʔTVCϝιουʹϒϩοΫΛͨ͠ͷ
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 21
Slide 21 text
DQBOpMFͷTZOUBYJO3VCZ
w ϋογϡͷΩʔUFTUϝιου
w ϋογϡͷόϦϡʔTVCϝιουʹϒϩοΫΛͨ͠ͷ
w ϒϩοΫͷதSFRVJSFTϝιουʹҾΛͨ͠ͷ
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 22
Slide 22 text
DQBOpMFͷTZOUBYJO3VCZ
w ͜͜·Ͱ͔ΕධՁͰ͖Δʂʂʂʂʂʂʁ
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 23
Slide 23 text
3VCZͰDQBOpMFΛධՁ͢Δ
Slide 24
Slide 24 text
3VCZͰDQBOpMFΛධՁ͢Δ
w SFRVJSFTPSҾΛड͚औΔϝιου
requires ‘Plack';
requires 'Test2', '1.302138';
Slide 25
Slide 25 text
3VCZͰDQBOpMFΛධՁ͢Δ
w SFRVJSFTPSҾΛड͚औΔϝιου
w ͱΓ͋͑ͣͲΜͳϞδϡʔϧΛ͍͍͔͔ͨΔΑ͏ʹɺΠϯελ
ϯεมʹͰ٧Ί͓ͯ͜͏
@requires = []
def requires(module_name, version = nil)
@requires << [module_name, version]
end
Slide 26
Slide 26 text
3VCZͰDQBOpMFΛධՁ͢Δ
w POϋογϡΛҾʹऔΔϝιου
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 27
Slide 27 text
3VCZͰDQBOpMFΛධՁ͢Δ
w POϋογϡΛҾʹऔΔϝιου
w ͱΓࣺ͋͑ͣͯΕ͍͍͔ͳɻɻ
w ͋ͱͰ͏Α͏ʹվળ͠·͢ ޙड़
def on(_hash)
# nop
end
Slide 28
Slide 28 text
3VCZͰDQBOpMFΛධՁ͢Δ
w UFTUϋογϡͷΩʔ
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 29
Slide 29 text
3VCZͰDQBOpMFΛධՁ͢Δ
w UFTUϋογϡͷΩʔ
w ͳͷͰɺจࣈྻͷlUFTUzͰฦ͓͚ͯ͠ྑ͍
w Կฦ͞ͳͯ͘OJM͕ΩʔʹͳΔ͚ͩͰ͢
def test
"test"
end
Slide 30
Slide 30 text
3VCZͰDQBOpMFΛධՁ͢Δ
w TVCϒϩοΫΛड͚औΔϝιου
on({
test => sub { requires 'Test2', '1.302138'; }
})
Slide 31
Slide 31 text
3VCZͰDQBOpMFΛධՁ͢Δ
w TVCϒϩοΫΛड͚औΔϝιου
w ZJFME͠·͢
def sub
yield
end
Slide 32
Slide 32 text
3VCZͰDQBOpMFΛධՁ͢Δ
w TVCϒϩοΫΛड͚औΔϝιου
w ZJFME͠·͢
w ༨ஊ
POΛ༗ޮʹ͏ͨΊʹԆධՁͤ͞ΔͷͰMBNCEBͰแΉ
def sub
-> { yield }
end
def on(hash)
hash.each do |env, sub|
sub.call
end
end
Slide 33
Slide 33 text
3VCZͰDQBOpMFΛධՁ͢Δ
w ͋ͱ࣮ߦ͢Δ͚ͩʂʂʂ
w σϞ
eval File.read("./cpanfile")
pp @requires
Slide 34
Slide 34 text
3VCZͰDQBOpMFΛධՁ͢Δ
w ͋ͱ࣮ߦ͢Δ͚ͩʂʂʂ
$ ruby cpanfile_parser.rb
[["Plack", nil], ["Test2", "1.302138"]]
Slide 35
Slide 35 text
DQBOpMFΛධՁͰ͖ΔͱԿ
͕Ͱ͖Δ͔
Slide 36
Slide 36 text
DQBOpMFΛධՁͰ͖ΔͱԿ͕Ͱ͖Δ͔
w %FQFOEBCPUΛ࡞Δ͜ͱ͕Ͱ͖Δ
w ϓϩδΣΫτ͕ґଘ͍ͯ͠ΔϥΠϒϥϦͷҰཡදࣔ
w ࠷৽όʔδϣϯΑΓݹ͍όʔδϣϯͰݻఆ͍ͯͨ͠ΒܯࠂΛग़͢
Slide 37
Slide 37 text
DQBOpMFΛධՁͰ͖ΔͱԿ͕Ͱ͖Δ͔
w %FQFOEBCPUΛ࡞Δ͜ͱ͕Ͱ͖Δ
w ϓϩδΣΫτ͕ґଘ͍ͯ͠ΔϥΠϒϥϦͷҰཡදࣔ
w ࠷৽όʔδϣϯΑΓݹ͍όʔδϣϯͰݻఆ͍ͯͨ͠ΒܯࠂΛग़͢
w ͱ͍͏Θ͚Ͱ࡞Γ·ͨ͠ EFNP