simple ruby project layout question

T

Tom Cloyd

Trying to get up to standards, here. Reading about project layout in
Programming Ruby (3rd ed)., where reference is made to "...some strong
Ruby conventions, first seen in Minero Aoki’s setup.rb and later
enshrined in the Gems system...".

One apparently expect to see in the project root a \bin, \lib, \doc,
subdir, and quite possible a \db and \log and etc., subdirs.

My question is about the \bin subdir. I was initially puzzled. How could
a Ruby project have a binary files subdirectory? I went snooping in some
installed gems I have, and I found very simple launch scripts in the
\bin subdir - so far all ruby scripts, with the first line making clear
that Ruby is to interpret the script (I'm also just getting into Bash
tonight). OK, that all makes sense, except for the "\bin" name.

So, in the Ruby world, \bin simply means "whatever I'm using to launch
my program", if it's used at all, right? And "\bin" is simply an
anachronism - has always been done that way?

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
J

James Britt

Tom said:
So, in the Ruby world, \bin simply means "whatever I'm using to launch
my program", if it's used at all, right? And "\bin" is simply an
anachronism - has always been done that way?

Pretty much.

If your app includes other command-line tools they would go in bin/ as
well.

--
James Britt

www.happycamperstudios.com - Wicked Cool Coding
www.jamesbritt.com - Playing with Better Toys
www.ruby-doc.org - Ruby Help & Documentation
www.rubystuff.com - The Ruby Store for Ruby Stuff
 
D

David Masover

Tom said:
So, in the Ruby world, \bin simply means "whatever I'm using to launch
my program", if it's used at all, right? And "\bin" is simply an
anachronism - has always been done that way?

Right -- and it's not unique to Ruby either.

From your use of backslashes, I'm guessing you're on Windows, so I can
see your confusion. On Unix, quite often you find shell scripts in
various bin directories. A few examples from my system: /bin/which,
/usr/bin/git-svn, etc.

I think the reason it's done this way is that once upon a time, most or
all of the files in those system directories were binary executables.
People probably started putting scripts there because it was already in
the PATH anyway, and it makes sense -- in the above example, all the
user really cares about is git-svn is another git command, so to be
consistent, why not put all of Git together? Even if most commands are
binary, but some are Perl scripts?

So, in the Ruby world, bin is just "executables", binary or otherwise,
as distinct from lib, where you would find library code. Both are ruby
files, but bin/foo you might actually expect to set executable and run
as a command, whereas if you did the same to lib/foo.rb, it probably
wouldn't do anything.
 
T

Tom Cloyd

David said:
Right -- and it's not unique to Ruby either.

From your use of backslashes, I'm guessing you're on Windows, so I can
see your confusion. On Unix, quite often you find shell scripts in
various bin directories. A few examples from my system: /bin/which,
/usr/bin/git-svn, etc.

I think the reason it's done this way is that once upon a time, most
or all of the files in those system directories were binary
executables. People probably started putting scripts there because it
was already in the PATH anyway, and it makes sense -- in the above
example, all the user really cares about is git-svn is another git
command, so to be consistent, why not put all of Git together? Even if
most commands are binary, but some are Perl scripts?

So, in the Ruby world, bin is just "executables", binary or otherwise,
as distinct from lib, where you would find library code. Both are ruby
files, but bin/foo you might actually expect to set executable and run
as a command, whereas if you did the same to lib/foo.rb, it probably
wouldn't do anything.
James, David, thanks! Just wanted to make sure I understood.

Sad story: those backslashes were a slip. I've been off Windows for
almost a year. It's been a long night, week, life. I'm tired. I was also
trying to get past my first Bash script, and get Cucumber/RSpec based
testing going, and I'm a bit boggled. For 15 min. I simply could NOT get
a very simple bash script to launch 'cause I was invoking
".\script-name". When I finally caught the problem and flipped the
backslash, I felt pretty foolish. Not the first time, though!

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
7

7stud --

Tom said:
".\script-name". When I finally caught the problem and flipped the
backslash, I felt pretty foolish. Not the first time, though!

Back slashes are dangerous in strings because of all the escape
sequences that can be used in strings. \s = space, so your command was
interpreted as: ". cript-name". I'm guessing your system looked for a
program named "." somewhere in your path, with the "cript-name" part
being an arg for the "." program.
 
J

Joel VanderWerf

David Masover wrote:
...
So, in the Ruby world, bin is just "executables", binary or otherwise,
as distinct from lib, where you would find library code. Both are ruby
files, but bin/foo you might actually expect to set executable and run
as a command, whereas if you did the same to lib/foo.rb, it probably
wouldn't do anything.

Not just the ruby world.

count = 0
Dir['/usr/bin/*'].each do |fn|
next if File.directory? fn
File.open(fn) do |f|
count += 1 if /^#!/ =~ f.read(100)
end
end
p count # ==> 574

Of course some of those are shell scripts that just execute a true
"binary executable".
 
D

David Masover

7stud said:
Back slashes are dangerous in strings because of all the escape
sequences that can be used in strings. \s = space, so your command was
interpreted as: ". cript-name". I'm guessing your system looked for a
program named "." somewhere in your path, with the "cript-name" part
being an arg for the "." program.

If that were the case, '.' is an alias for 'source', which means it
would've taken a file called 'cript-name' in the current directory and
executed it.

On the other hand, if those quotes were included, it would actually be
looking for a program named '. cript-name', as spaces are allowed in
filenames...
 
T

Tom Cloyd

David said:
If that were the case, '.' is an alias for 'source', which means it
would've taken a file called 'cript-name' in the current directory and
executed it.

On the other hand, if those quotes were included, it would actually be
looking for a program named '. cript-name', as spaces are allowed in
filenames...
Ah...so many ways to screw up. So little time.

t.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
T

Tom Cloyd

Joel said:
David Masover wrote:
...
So, in the Ruby world, bin is just "executables", binary or
otherwise, as distinct from lib, where you would find library code.
Both are ruby files, but bin/foo you might actually expect to set
executable and run as a command, whereas if you did the same to
lib/foo.rb, it probably wouldn't do anything.

Not just the ruby world.

count = 0
Dir['/usr/bin/*'].each do |fn|
next if File.directory? fn
File.open(fn) do |f|
count += 1 if /^#!/ =~ f.read(100)
end
end
p count # ==> 574

Of course some of those are shell scripts that just execute a true
"binary executable".
Yikes. You sure know how to make a point! Thanks for the demo.

T.

--

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tom Cloyd, MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< (e-mail address removed) >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top