| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Acme::CreatingCPANModules; |
|
2
|
|
|
|
|
|
|
|
|
3
|
2
|
|
|
2
|
|
47451
|
use warnings; |
|
|
2
|
|
|
|
|
5
|
|
|
|
2
|
|
|
|
|
70
|
|
|
4
|
2
|
|
|
2
|
|
14
|
use strict; |
|
|
2
|
|
|
|
|
5
|
|
|
|
2
|
|
|
|
|
569
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
=head1 NAME |
|
7
|
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
Acme::CreatingCPANModules - Created during a talk in London |
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head1 VERSION |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
Version 0.01 |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=cut |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
our $VERSION = '0.01'; |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
This module doesn't actually *do* anything... |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
It does have a new constructor, and a set and a get method, just so |
|
23
|
|
|
|
|
|
|
you can do some tests. |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
use Acme::CreatingCPANModules; |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
my $foo = Acme::CreatingCPANModules->new(); |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
$foo->set( 3 ); |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
my $bar = $foo->get(); |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
=head1 THE TALK |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
[give or take a word] |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
[the slides that accompanied this talk are available through |
|
38
|
|
|
|
|
|
|
http://jose-castro.org] |
|
39
|
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
[we start at the first slide and you'll see a slide tag each time the |
|
41
|
|
|
|
|
|
|
slide is supposed to change (just press enter for that)] |
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
Hello! |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
First of all... [slide] |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
Good :-) |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
My name is José and I'm here to take you along the creation of a CPAN |
|
50
|
|
|
|
|
|
|
module. |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
The first thing I'l like to tell you is this: do not bother taking |
|
53
|
|
|
|
|
|
|
notes! |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
These slides are already online, and so is my speech (give or take a |
|
56
|
|
|
|
|
|
|
word), and by the end of this talk I'll be giving you the link you can |
|
57
|
|
|
|
|
|
|
use to get them. |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
Also, don't bother noting down links... apart from the last one, of |
|
60
|
|
|
|
|
|
|
course, because with that one you'll get to the slides and you'll be |
|
61
|
|
|
|
|
|
|
able to get the other links from there. |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
[slide] And now we're going to create a CPAN module. |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
[slide] We assume you're here either because [slide] you want to be a |
|
66
|
|
|
|
|
|
|
CPAN contributor, [slide] you want to be a better CPAN contributor, or |
|
67
|
|
|
|
|
|
|
[slide] you have absolutely no idea what a lexical attribute is and |
|
68
|
|
|
|
|
|
|
couldn't care less [at the same time, Abigail was giving his talk on |
|
69
|
|
|
|
|
|
|
Lexical Attributes in the advanced room]. |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
[slide] So let's get started, with [slide] C. |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
Now, you should know that there are other ways to create a CPAN |
|
74
|
|
|
|
|
|
|
module, and no way is the true way. They all have some advantages and |
|
75
|
|
|
|
|
|
|
some disadvantages. Anyway, for the purpose of this talk, we'll be |
|
76
|
|
|
|
|
|
|
using C, and if there's time by the end I'll talk a |
|
77
|
|
|
|
|
|
|
bit about the other alternatives. |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
So let's get started! |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
Just install C (if you don't know how to do that you |
|
82
|
|
|
|
|
|
|
can talk to me later on) and you'll be provided the C |
|
83
|
|
|
|
|
|
|
command. |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
Type it and you'll see [slide] WHOAA!!! |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
[slide] OK, relax :-) |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
C has a bunch of options you can use, but the most |
|
90
|
|
|
|
|
|
|
important three ones are these: --module for the module name, --author |
|
91
|
|
|
|
|
|
|
for the author's name (you) and --email for the author's email address |
|
92
|
|
|
|
|
|
|
(it's always good to allow users to contact you). |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
[slide] So let's exemplify this (we'll do this in the slides and then |
|
95
|
|
|
|
|
|
|
we'll move on to a terminal and try all this again). |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
[slide] I'm going to create the module C, |
|
98
|
|
|
|
|
|
|
[slide] with the author "Jose Castro" (that's me, in case you didn't |
|
99
|
|
|
|
|
|
|
notice... my name is also in the bottom right corner of the slides... |
|
100
|
|
|
|
|
|
|
:-) ) [slide] and my email address: cog at cpan dot org. |
|
101
|
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
[slide] There. Module created! |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
No, it doesn't do anything yet, but it already exists! |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
[slide] So let's see what happened and exactly what was created. |
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
With the `tree` command [If your system doesn't provide the `tree` |
|
109
|
|
|
|
|
|
|
command tool you can try installing C]! |
|
110
|
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
[slide] OK, then... |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
OK, let's go through this step by step... |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
Here on the bottom we have a t/ directory, which is the directory |
|
116
|
|
|
|
|
|
|
where you put your test files (it's a convention). Inside it are a few |
|
117
|
|
|
|
|
|
|
.t files (that's also a convention for test files). We'll get to these |
|
118
|
|
|
|
|
|
|
in a while. |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
You'll also notice the .pm file. That's your module! |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
Everybody knows what a README is, but we'll also get to that. |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
The Makefile.PL is what's going to be used to install your module, and |
|
125
|
|
|
|
|
|
|
MANIFEST contains the list of files the distribution includes... don't |
|
126
|
|
|
|
|
|
|
try to think to hard about all this, we'll get to all this in a |
|
127
|
|
|
|
|
|
|
moment. |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
And then there's the Changes file, where you're supposed to write down |
|
130
|
|
|
|
|
|
|
the changes you made to your module each new version. |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
Let's look at the files in detail. |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
[slide] Here's a Changes file. |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
Note that the order of the changes is chronologically inversed. Why? |
|
137
|
|
|
|
|
|
|
Because the purporse of a changes file is (among others) to let the |
|
138
|
|
|
|
|
|
|
user know what you changed from the last version, so that he can |
|
139
|
|
|
|
|
|
|
decide if he wants to install your module. |
|
140
|
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
Hence, and since browsers and editors usually open files in their |
|
142
|
|
|
|
|
|
|
beginning, it's only reasonable that you put the most recent changes |
|
143
|
|
|
|
|
|
|
on the top of the file. |
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
As for what you put in here, it's kind of up to you, but you don't |
|
146
|
|
|
|
|
|
|
need to be too technical. If you added some tests, just say "added |
|
147
|
|
|
|
|
|
|
some tests". You don't really need to specify which ones and the |
|
148
|
|
|
|
|
|
|
purpose of each of them. |
|
149
|
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
[slide] Next up we have the MANIFEST. This is the file that lists |
|
151
|
|
|
|
|
|
|
everything that goes into your distribution. |
|
152
|
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
Why? Because this way you're able to put more stuff in the directory |
|
154
|
|
|
|
|
|
|
and not have the final step of creating the distribution include those |
|
155
|
|
|
|
|
|
|
files. |
|
156
|
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
If you're thinking "why would I put things in that directory if they |
|
158
|
|
|
|
|
|
|
weren't part of the distribution", think, for instance, in a test file |
|
159
|
|
|
|
|
|
|
that only runs in your machine. |
|
160
|
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
One of my modules has tests with two files that take almost 200M each. |
|
162
|
|
|
|
|
|
|
I don't think the users wouldn't want to download a 400M distribution |
|
163
|
|
|
|
|
|
|
when they can do with a 20K one. |
|
164
|
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
Hence, those files of mine are in that directory but not listed in the |
|
166
|
|
|
|
|
|
|
MANIFEST. |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
The drawback on this is that whenever you add a file to the |
|
169
|
|
|
|
|
|
|
distribution you have to remember to update the MANIFEST. |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
[slide] Next up, we have Makefile.PL |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
Now, you really don't need to understand what's in here, but it's |
|
174
|
|
|
|
|
|
|
still quite self-explanatory. |
|
175
|
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
There's the name of the of the distribution, the author, etc. Do note |
|
177
|
|
|
|
|
|
|
the C parameter. If your distribution requires another |
|
178
|
|
|
|
|
|
|
module to be installed, that's where you defined that. Just add the |
|
179
|
|
|
|
|
|
|
name of the module to that hash and put the minimum version number of |
|
180
|
|
|
|
|
|
|
the module that you require. |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
[slide] Next we have the README. What you put in the README is, once |
|
183
|
|
|
|
|
|
|
again, up to you. I always put the same documentation from the main |
|
184
|
|
|
|
|
|
|
module, some people just put a template README in all their |
|
185
|
|
|
|
|
|
|
distributions. |
|
186
|
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
Whatever you do, don't forget to update the README at least once, as |
|
188
|
|
|
|
|
|
|
it's the file many users look at and the default documentation can be |
|
189
|
|
|
|
|
|
|
kind of... embarassing ;-) |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
[slide] And now we finally have our module! |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
The module is comprised of two things: code and documentation. |
|
194
|
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
Both are equally important. |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
I can't stress how much. |
|
198
|
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
Whether you put your documentation at the beginning or at the end of |
|
200
|
|
|
|
|
|
|
the file, or perhaps entwined with the code, is, again, up to you. |
|
201
|
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
We're not staying for a long time at this slide because we'll have the |
|
203
|
|
|
|
|
|
|
time to do so in the demo, right after this. |
|
204
|
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
[slide] And now we're at the first test file. |
|
206
|
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
Currently, through C, it checks to see if the module loads |
|
208
|
|
|
|
|
|
|
correctly. It also diagnoses what it's doing. |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
[slide] Then we have another test file, which was recently introduced, |
|
211
|
|
|
|
|
|
|
to check if files like README and Changes have content written by you |
|
212
|
|
|
|
|
|
|
or are just the default templates. |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
[slide] The next one is checks if you're documenting all your public |
|
215
|
|
|
|
|
|
|
functions. It assumes that if you have a private function (that is, a |
|
216
|
|
|
|
|
|
|
function that's not meant for the public but rather to be used by your |
|
217
|
|
|
|
|
|
|
other functions) you will name it something commencing with an |
|
218
|
|
|
|
|
|
|
underscore. |
|
219
|
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
This means that you need a section with the name of each function that |
|
221
|
|
|
|
|
|
|
doesn't begin with an underscore. |
|
222
|
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
[slide] And this one over here ensures that your POD is valid. |
|
224
|
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
[slide] So let's go through it one more time: Changes for the list |
|
226
|
|
|
|
|
|
|
of changes, MANIFEST with the list of files, Makefile.PL to be used |
|
227
|
|
|
|
|
|
|
for installation, README, your module, and a bunch of tests. |
|
228
|
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
[slide] Very well, then. Time for the live demo! |
|
230
|
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
[I change to the next workspace and we're set] You know what they say |
|
232
|
|
|
|
|
|
|
about live demos? They say "Don't!" O:-) |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
OK, then, first we'll create our module. [I type `module-starter |
|
235
|
|
|
|
|
|
|
--module=Acme::CreatingCPANModules --author='Jose Castro' |
|
236
|
|
|
|
|
|
|
--email=cog@cpan.org`] |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
There, done. |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
Now, the first I'm gonna do is get rid of C. Well, not |
|
241
|
|
|
|
|
|
|
really getting rid of it, I'll just put it aside for the time being |
|
242
|
|
|
|
|
|
|
and I'll explain you later why I'm doing it. [`cd |
|
243
|
|
|
|
|
|
|
Acme-CreatingCPANModules` and `mv t/boilerplate .`] |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
Now we're set. |
|
246
|
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
Suppose we were installing this module. |
|
248
|
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
The first thing to do it `perl Makefile.PL` [`perl Makefile.PL` and ls |
|
250
|
|
|
|
|
|
|
-al]. As you can see, this has created C. |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
This now allows us to do things like this [`make`]. And now we can |
|
253
|
|
|
|
|
|
|
test our distribution [`make test`]. |
|
254
|
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
As you can see, all our tests have passed... but that's simply because |
|
256
|
|
|
|
|
|
|
we still don't have anything interesting in our module... |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
Let's add some code. [I add the code for new(), set() and get(), as |
|
259
|
|
|
|
|
|
|
follows: |
|
260
|
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
sub new { |
|
262
|
|
|
|
|
|
|
my $self = shift; |
|
263
|
|
|
|
|
|
|
my $foo = shift; |
|
264
|
|
|
|
|
|
|
bless \$foo, $self; |
|
265
|
|
|
|
|
|
|
} |
|
266
|
|
|
|
|
|
|
|
|
267
|
|
|
|
|
|
|
sub set { |
|
268
|
|
|
|
|
|
|
my $self = shift; |
|
269
|
|
|
|
|
|
|
my $newfoo = shift; |
|
270
|
|
|
|
|
|
|
defined $newfoo or return undef; |
|
271
|
|
|
|
|
|
|
$$self = $newfoo; |
|
272
|
|
|
|
|
|
|
return $self->get(); |
|
273
|
|
|
|
|
|
|
} |
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
sub get { |
|
276
|
|
|
|
|
|
|
my $self = shift; |
|
277
|
|
|
|
|
|
|
return $$self; |
|
278
|
|
|
|
|
|
|
} |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
and some documentation for these methods] |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
Now, let's run the tests again. [`make test`] |
|
283
|
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
OK, so we haven't broken anything yet, good :-) |
|
285
|
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
Now, let's add some more tests [`cp t/00-load.t t/01-basic.t`]. |
|
287
|
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
As you can see, [`make test`] running the tests again runs this new file. |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
Now let's change a few things in this new file of ours. [`vim |
|
291
|
|
|
|
|
|
|
t/01-basic.t`, remove the last line and add instead: |
|
292
|
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
my $object = Acme::CreatingCPANModules->new(); |
|
294
|
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
isa_ok( $object, 'Acme::CreatingCPANModules' ); |
|
296
|
|
|
|
|
|
|
] |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
This is going to ensure that creating a new Acme::CreatingCPANModules |
|
299
|
|
|
|
|
|
|
object actually creates one. |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
Now, what do you think will happen if I run the tests again? |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
[`make test`] See? If complains that you ran one more test than |
|
304
|
|
|
|
|
|
|
expected. Have a look to the test file again. |
|
305
|
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
See right over there? You're saying that you're going to run one test |
|
307
|
|
|
|
|
|
|
[point to third line], but you actually run two [point to use_ok and |
|
308
|
|
|
|
|
|
|
to isa_ok]. |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
What you'd have to do is to change that 1 to a 2, but I'll tell you a |
|
311
|
|
|
|
|
|
|
little secret of mine: just use C with 'no_plan' [change |
|
312
|
|
|
|
|
|
|
the third line in the test file to: |
|
313
|
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
use Test::More 'no_plan';#tests => 1; |
|
315
|
|
|
|
|
|
|
]. |
|
316
|
|
|
|
|
|
|
|
|
317
|
|
|
|
|
|
|
OK, so let's add some more tests. |
|
318
|
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
[add, at the bottom of the file: |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
$object->set( 5 ); |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
is( $object->get(), 5 ); |
|
324
|
|
|
|
|
|
|
] |
|
325
|
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
Now let's run the tests [`make test`]. |
|
327
|
|
|
|
|
|
|
|
|
328
|
|
|
|
|
|
|
See? Just like that! |
|
329
|
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
What do we have to now? We have to update the MANIFEST and the Changes |
|
331
|
|
|
|
|
|
|
file. [`vim MANIFEST` and remove the boilerplate.t line and add |
|
332
|
|
|
|
|
|
|
t/01-basic.t`, `vim Changes`, in Changes, add the date/time] |
|
333
|
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
Now let's create our distribution. How do you do that? With `make |
|
335
|
|
|
|
|
|
|
dist` [`perl Makefile.PL`, `make`, `make test`, `make dist`, `ls -al`] |
|
336
|
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
Now, you have to create your Makefile again, because you change the |
|
338
|
|
|
|
|
|
|
files. When in doubt, you can always run these four steps. |
|
339
|
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
As you can see, we now have a distribution, ready to be uploaded. |
|
341
|
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
How do you upload something to CPAN? [cut to screenshots of |
|
343
|
|
|
|
|
|
|
pause.perl.org] |
|
344
|
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
[first picture] |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
This is the PAUSE. The Perl Authors Upload Server. |
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
This is what we use to upload distributions. |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
First, you need an account. You can request one here [point to |
|
352
|
|
|
|
|
|
|
"Request PAUSE account"]. |
|
353
|
|
|
|
|
|
|
|
|
354
|
|
|
|
|
|
|
[second picture] |
|
355
|
|
|
|
|
|
|
|
|
356
|
|
|
|
|
|
|
To be given a PAUSE account you have to fill in your name, email |
|
357
|
|
|
|
|
|
|
address, the desired ID and one or two more things. You also have to |
|
358
|
|
|
|
|
|
|
explain what you're planning to contribute. |
|
359
|
|
|
|
|
|
|
|
|
360
|
|
|
|
|
|
|
This is not so someone judges whether your contribution is worth it or |
|
361
|
|
|
|
|
|
|
not. It's just so you can tell the real people from the trolls. |
|
362
|
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
You have a few days (because the PAUSE administrators aren't many and |
|
364
|
|
|
|
|
|
|
they might be busy) and eventually you'll get an answer. There's a |
|
365
|
|
|
|
|
|
|
slight chance (just slight) that your request doesn't get looked at. |
|
366
|
|
|
|
|
|
|
If you don't get an answer, try again about a week later, but this is |
|
367
|
|
|
|
|
|
|
really not common, I'm just warning you :-) |
|
368
|
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
[third picture] |
|
370
|
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
Once you're in, you get a lot to choose from. |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
[fourth picture] |
|
374
|
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
Uploading a distribution, for instance, is really simple. Just press |
|
376
|
|
|
|
|
|
|
the button [point to "Upload a file to CPAN"], |
|
377
|
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
[fifth picture] |
|
379
|
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
Select your tgz file and press the button [point to "Upload this file |
|
381
|
|
|
|
|
|
|
from my disk"] |
|
382
|
|
|
|
|
|
|
|
|
383
|
|
|
|
|
|
|
This pretty much sums up the important things you need to know, but, |
|
384
|
|
|
|
|
|
|
of course, there's a lot more [back to slides]. |
|
385
|
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
[slide] |
|
387
|
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
There's a lot of basic and advanced stuff we didn't cover in this |
|
389
|
|
|
|
|
|
|
talk. |
|
390
|
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
[slide] |
|
392
|
|
|
|
|
|
|
|
|
393
|
|
|
|
|
|
|
What next? |
|
394
|
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
I'd like to point you to another article I wrote a while ago, which is |
|
396
|
|
|
|
|
|
|
available on Perlmonks. |
|
397
|
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
There's also a very good book on the subject, which covers a lot more |
|
399
|
|
|
|
|
|
|
than what we talked about here. The book is "Writing Perl Modules for |
|
400
|
|
|
|
|
|
|
CPAN", by Sam Tregar, and it's free, as in "you can download it". |
|
401
|
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
You can subscribe the C mailing list if you |
|
403
|
|
|
|
|
|
|
need more help (you can also contact me). |
|
404
|
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
If you need to contact a PAUSE admin, send an email to |
|
406
|
|
|
|
|
|
|
C (you can't subscribe that list, you can only send |
|
407
|
|
|
|
|
|
|
mail to it). |
|
408
|
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
The slides for this talk are inside a module called |
|
410
|
|
|
|
|
|
|
C, available on CPAN. You can get to this |
|
411
|
|
|
|
|
|
|
module from my homepage, http://jose-castro.org/ |
|
412
|
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
It's really simple because it's my name and it's been in every slide |
|
414
|
|
|
|
|
|
|
so far! :-) Bottom right corner, Jose Castro, can't miss it! :-) |
|
415
|
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
Somewhere on that page you'll be able to find these slides. I think |
|
417
|
|
|
|
|
|
|
currently their at the top right corner. That might change in the |
|
418
|
|
|
|
|
|
|
future, and they may go under the "Talks" section, but they'll be |
|
419
|
|
|
|
|
|
|
there and they'll be easy to find. |
|
420
|
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
So thank you very much for your time, get C on your |
|
422
|
|
|
|
|
|
|
machine and start a module today. |
|
423
|
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
Don't be afraid of uploading it to CPAN. People will help you when you |
|
425
|
|
|
|
|
|
|
do something wrong :-) |
|
426
|
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
[slide] |
|
428
|
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
Thank you. |
|
430
|
|
|
|
|
|
|
|
|
431
|
|
|
|
|
|
|
Any questions? [email me at cog@cpan.org if you have any :-) ] |
|
432
|
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
I'll leave the previous slide with the links while I answer questions. |
|
434
|
|
|
|
|
|
|
[and back to the previous slide] |
|
435
|
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
=head1 EXPORT |
|
437
|
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
This module is OO, so it doesn't export anything... |
|
439
|
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
=head1 FUNCTIONS |
|
441
|
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
=head2 new |
|
443
|
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
Creates a new Acme::CreatingCPANModules object. |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
=cut |
|
447
|
|
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
sub new { |
|
449
|
1
|
|
|
1
|
1
|
14
|
my $self = shift; |
|
450
|
1
|
|
|
|
|
2
|
my $foo = shift; |
|
451
|
1
|
|
|
|
|
6
|
bless \$foo, $self; |
|
452
|
|
|
|
|
|
|
} |
|
453
|
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
=head2 set |
|
455
|
|
|
|
|
|
|
|
|
456
|
|
|
|
|
|
|
Sets the new value of the object. |
|
457
|
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
=cut |
|
459
|
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
sub set { |
|
461
|
1
|
|
|
1
|
1
|
778
|
my $self = shift; |
|
462
|
1
|
|
|
|
|
3
|
my $newfoo = shift; |
|
463
|
1
|
50
|
|
|
|
5
|
defined $newfoo or return undef; |
|
464
|
1
|
|
|
|
|
5
|
$$self = $newfoo; |
|
465
|
1
|
|
|
|
|
7
|
return $self->get(); |
|
466
|
|
|
|
|
|
|
} |
|
467
|
|
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
=head2 get |
|
469
|
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
Gets the current value of the object. |
|
471
|
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
=cut |
|
473
|
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
sub get { |
|
475
|
2
|
|
|
2
|
1
|
5
|
my $self = shift; |
|
476
|
2
|
|
|
|
|
9
|
return $$self; |
|
477
|
|
|
|
|
|
|
} |
|
478
|
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
=head1 AUTHOR |
|
480
|
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
Jose Castro, C<< >> |
|
482
|
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
=head1 BUGS |
|
484
|
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
Please report any bugs or feature requests to |
|
486
|
|
|
|
|
|
|
C, or through the web interface at |
|
487
|
|
|
|
|
|
|
L. |
|
488
|
|
|
|
|
|
|
I will be notified, and then you'll automatically be notified of progress on |
|
489
|
|
|
|
|
|
|
your bug as I make changes. |
|
490
|
|
|
|
|
|
|
|
|
491
|
|
|
|
|
|
|
=head1 SUPPORT |
|
492
|
|
|
|
|
|
|
|
|
493
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command. |
|
494
|
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
perldoc Acme::CreatingCPANModules |
|
496
|
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
You can also look for information at: |
|
498
|
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
=over 4 |
|
500
|
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
=item * AnnoCPAN: Annotated CPAN documentation |
|
502
|
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
L |
|
504
|
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
=item * CPAN Ratings |
|
506
|
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
L |
|
508
|
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
=item * RT: CPAN's request tracker |
|
510
|
|
|
|
|
|
|
|
|
511
|
|
|
|
|
|
|
L |
|
512
|
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
=item * Search CPAN |
|
514
|
|
|
|
|
|
|
|
|
515
|
|
|
|
|
|
|
L |
|
516
|
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
=back |
|
518
|
|
|
|
|
|
|
|
|
519
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
520
|
|
|
|
|
|
|
|
|
521
|
|
|
|
|
|
|
http://jose-castro.org for the slides that accompany this talk. |
|
522
|
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
|
524
|
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
The audience at the London Perl Workshop 2005. |
|
526
|
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE |
|
528
|
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
Copyright 2005 Jose Castro, all rights reserved. |
|
530
|
|
|
|
|
|
|
|
|
531
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it |
|
532
|
|
|
|
|
|
|
under the same terms as Perl itself. |
|
533
|
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
=cut |
|
535
|
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
1; # End of Acme::CreatingCPANModules |