# Simple ruby project layout question

**URL:** <https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329>\
**Category:** Ruby\
**Created:** [February 14, 2009, 4:08pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329 "2009-02-14T16:08:57Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 4:08pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/1 "2009-02-14T16:08:57Z")

</div>

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 A.’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.

–

```auto
Tom C., MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< removed_email_address@domain.invalid >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)

```

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 5:21pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/2 "2009-02-14T17:21:05Z")

</div>

Tom C. wrote:

> 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 B.

[www.happycamperstudios.com](http://www.happycamperstudios.com) - Wicked Cool Coding  
[www.jamesbritt.com](http://www.jamesbritt.com) - Playing with Better Toys  
[www.ruby-doc.org](http://www.ruby-doc.org) - Ruby Help & Documentation  
[www.rubystuff.com](http://www.rubystuff.com) - The Ruby Store for Ruby Stuff

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 5:46pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/3 "2009-02-14T17:46:17Z")

</div>

Tom C. wrote:

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

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 6:12pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/4 "2009-02-14T18:12:42Z")

</div>

David M. wrote:

> /usr/bin/git-svn, etc.  
> 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.

–

```auto
Tom C., MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< removed_email_address@domain.invalid >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)

```

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 7:44pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/5 "2009-02-14T19:44:49Z")

</div>

Tom C. wrote:

> “.\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.

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 8:05pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/6 "2009-02-14T20:05:47Z")

</div>

David M. 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”.

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 14, 2009, 9:58pm UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/7 "2009-02-14T21:58:32Z")

</div>

7stud – wrote:

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

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 15, 2009, 2:23am UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/8 "2009-02-15T02:23:32Z")

</div>

David M. wrote:

> > was interpreted as: “. cript-name”. I’m guessing your system looked  
> > filenames…

Ah…so many ways to screw up. So little time.

t.

–

```auto
Tom C., MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< removed_email_address@domain.invalid >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)

```

---

<div class="post-metadata">

**Author:** ![tbcox23](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b9bd4f/32.png) [@tbcox23](https://www.ruby-forum.com/u/tbcox23)\
**Post date:** [February 15, 2009, 2:24am UTC](https://www.ruby-forum.com/t/simple-ruby-project-layout-question/160329/9 "2009-02-15T02:24:42Z")

</div>

Joel VanderWerf wrote:

> count = 0

Yikes. You sure know how to make a point! Thanks for the demo.

T.

–

```auto
Tom C., MS MA, LMHC - Private practice Psychotherapist
Bellingham, Washington, U.S.A: (360) 920-1226
<< removed_email_address@domain.invalid >> (email)
<< TomCloyd.com >> (website)
<< sleightmind.wordpress.com >> (mental health weblog)

```
