&gt; Using a bash script to automate the development environment setup sounds good [...]<p>No, it doesn&#x27;t sound good even remotely. This way you have method for setting
up things that is very brittle, probably can&#x27;t be run with confidence on
a machine that was already set up, and this method is not suitable for
production or test deployment, so you need to maintain <i>two</i> setup methods.<p>You should look at how developers of various distributions (Debian, CentOS&#x2F;Red
Hat, Fedora, Ubuntu) package their software. All these <i>foo-dev</i> packages
containing static libraries and headers, and <i>foo</i> packages with actual
libraries and tools, either having their respective dependencies (e.g.
<i>foo-dev</i> depending on gcc, so you&#x27;ll get compiler by just running `apt-get
install foo-dev&#x27;).<p>Apache is not a good choice for development tool. It&#x27;s not pretty to set up
a second instance that runs without root privileges. I use uWSGI for those,
I just use different communication protocols for production (FastCGI or
uWSGI&#x27;s own thing) and development (HTTP, to avoid setting up fully blown web
server).<p>Running `npm install&#x27; or `bower install&#x27; or `pip install&#x27; to just set up your
environment is a method for a big stall in case of network outage (see this
thread: <a href="https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=10984775" rel="nofollow">https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=10984775</a>), unless you prepare
local caches for <i>all these repositories</i>. You should have all the things in
your local repository, either source control repository (your stuff) or
packages repository (external dependencies).