Meu setup de desenvolvimento

Venho usando esse setup há um tempo, e recentemente precisei refazer tudo de novo. Então, para os futuros eu que terão que refazer tudo de novo em algum momento, deixo esse guia.

E para quem quiser copiar o meu setup também, fique a vontade.

Bash

Primeiro de tudo, meu script para deixar o bash mais bonito, pelo menos pra mim.

Eu modifico o prompt para um simples lambda com o diretório atual e o branch do git atual. Se o branch tiver alguma modificação, o prompt mostra um * ao lado do nome do branch. Bem simples. Já o esquema de cores, eu utilizo o Solarized Dark.

Para configurar tudo isso, basta utilizar este .bash_profile.

Zsh

Nos últimos dias descobri o Zsh. Bem, não descobri, só resolvi dar uma chance. E crianças, o Zsh é muito mais legal que o Bash. Alguns minutos usando o Zsh eu já resolvi migrar.

E já que estava mudando, resolvi mudar o esquema de cores do terminal também. Passei a usar o Cobalt2.

O que me fez trocar pro Zsh foi o Oh My Zsh. Ele adiciona vários plugins como o autocompletar do ls que permite selecionar com as setas uma pasta:

Aí é vantagem

Outros plugins que uso são:

  • git: faz o que o meu código do bash_profile já fazia e também fornece um autocompletar pros subcomandos do git.
  • ruby/rails/git-flow/brew: autocompletar pros subcomandos de todos esses comandos.
  • history-substring-search: permite pesquisar um comando no seu histórico digitando uma parte da pesquisa e usando as setas cima e baixo.
  • zsh-syntax-highlighting: coloriza os comandos digitados. Viu que o cd na screenshot aparece em verde? Poisé. Se fosse um comando inválido, apareceria em vermelho. Outras coisas são colorizadas também, como strings e parâmetros -

Homebrew

O Homebrew é um gerenciador de pacotes para o OS X. É ele quem vai cuidar de todos os programas que você vai instalar pra utilizar no terminal. Instalar o Homebrew é tão fácil quanto utilizá-lo:

λ ~ > /usr/bin/ruby -e \
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Só esperar a instalação e correr pro abraço. ?

RVM

O RVM é um gerenciador de versões do Ruby. Em vez de ficar substituindo o ruby padrão do seu OS X, é melhor utilizar o RVM, que te permite ter várias versões (1.8, 1.9, 2.0, 2.2…) e a troca entre elas é super simples. Também possibilita criar um gemset para cada projeto que você venha a desenvolver. A instalação é super simples:

λ ~ > \curl -sSL https://get.rvm.io | bash -s stable

Para instalar uma versão do Ruby, basta utilizar o comando:

λ ~ > rvm install "<versão-do-ruby>"

Para tornar uma versão a padrão do seu OS X, utilize o comando:

λ ~ > rvm use "<versão-do-ruby>" --default

Depois, é necessário instalar o Rails. Você pode utilizar uma gemset global ou uma gemset para cada projeto. Recomendo fortemente uma gemset por projeto, para evitar que aconteça de um projeto atualizar uma gem para uma versão incompatível em outro projeto.

Para criar uma gemset:

λ ~ > rvm gemset create "<nome-da-gemset>"

Depois de criado o gemset, você deve selecioná-la para uso.

λ ~ > rvm use "<versão-do-ruby>@<nome-da-gemset>"

E então basta instalar o Rails:

λ ~ > gem install rails -v "<versão-do-rails>"

Em cada projeto, você pode criar dois arquivos, .ruby-version e .ruby-gemset, para determinar qual gemset e versão do ruby utilizar naquele projeto. O RVM carrega a versão e a gemset no momento que você entra na pasta do projeto. Mão na roda.

Pow

O Pow é um servidor Rack super simples. Com ele você consegue se livrar de executar rails s toda vez que precisar executar sua aplicação e ainda por cima vem com um servidor DNS que mapeia cada aplicação sua para um domínio .dev. Para instalar o Pow, o comando é o seguinte:

λ ~ > git clone https://github.com/basecamp/pow.git
λ ~ > cd pow
λ ~ > npm --global install
λ ~ > npm --global run-script pow restart

Recomendo utilizar junto com o Powify e o Anvil. Para adicionar um projeto Rails ao Pow, é com o comando:

λ ~ > powify create "<nome-do-projeto>"

Você precisa estar na pasta do projeto Rails. Ele vai criar o domínio nome-do-projeto.dev e o servidor estará pronto para uso.

Para integrar o Pow com o RVM, é necessário utilizar este arquivo .powenv.

Apache

O OS X já vem com o Apache instalado. Basta apenas configurar. Para iniciar o Apache o comando é:

λ ~ > sudo apachectl start

e para parar:

λ ~ > sudo apachectl stop

e reiniciar:

λ ~ > sudo apachectl restart

Para configurar o DocumentRoot, crie (ou abra) o arquivo /etc/apache2/users/seu-usuário.conf com o seguinte conteúdo:

<Directory "/Users/username/Sites/">
  AllowOverride All
  Options Indexes MultiViews FollowSymLinks
  Require all granted
</Directory>

A permissão do arquivo deve ser 644. Para mudar, o comando é:

λ ~ > sudo chmod 644 "/etc/apache2/users/<seu-usuário>.conf"

Abra o arquivo de configuração do Apache que fica em /etc/apache2/httpd.conf e verifique se as linhas a seguir estão descomentadas:

LoadModule authz_core_module libexec/apache2/mod_authz_core.so
...
LoadModule authz_host_module libexec/apache2/mod_authz_host.so
...
LoadModule userdir_module libexec/apache2/mod_userdir.so
...
LoadModule php5_module libexec/apache2/libphp5.so
...
Include /private/etc/apache2/extra/httpd-userdir.conf

Se não estiverem, descomente-as. Agora abra o arquivo /private/etc/apache2/extra/httpd-userdir.conf e descomente a seguinte linha:

Include /private/etc/apache2/users/*.conf

Reinicie o Apache e tudo deverá estar funcionando lindamente.

Apache e Pow

Se além de Rails você também desenvolve PHP, é possível utilizar o apache do OS X, sem depender do MAMP. E ainda integrar com o esquema de domínios .dev.

O primeiro passo é configurar o Pow para mandar qualquer conexão que não seja para um aplicativo Rack para a porta 81, onde o Apache tomará conta:

λ ~ > echo 81 > ~/.pow/default

Agora é preciso configurar o Apache para escutar a porta 81. No OS X, o arquivo de configuração do Apache fica em /etc/apache2/httpd.conf. Procure pela diretiva Listen. Troque o 80 por 81.

O objetivo é fazer com que o Apache sirva qualquer pasta PHP sem a necessidade de criar um virtual host para cada, exatamente como o Pow. Uma das diretivas do Apache, VirtualDocumentRoot, permite a utilização de hosts como variáveis nas raízes de cada documento. Crie um bloco VirtualHost no arquivo /etc/apache2/extra/httpd-vhosts.conf assim:

<VirtualHost 127.0.0.1:81>
  ServerName any.dev
  ServerAlias *.dev
  VirtualDocumentRoot "/path/para/os/projetos/%-2+"
  ErrorLog "/path/para/os/projetos/logs/error_log"

  <Directory /path/para/os/projetos/%-2+>
    Options FollowSymLinks
    AllowOverride All
  </Directory>
</VirtualHost>

Agora é possível criar a pasta /path/para/os/projetos/meu-projeto e ela estará imediatamente disponível em meu-projeto.dev. E para criar um subdomínio subdominio.meu-projeto.dev basta criar a pasta /path/para/os/projetos/subdominio.meu-projeto

Apache e SSL

Para configurar o seu projeto com HTTPS e SSL, você precisa editar o arquivo de configurações do Apache que fica em /etc/apache2/httpd.conf. Descomente as seguintes linhas:

LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
...
LoadModule ssl_module libexec/apache2/mod_ssl.so
...
Include /private/etc/apache2/extra/httpd-ssl.conf

Agora abra o arquivo /private/etc/apache2/extra/httpd-ssl.conf e remova qualquer diretiva VirtualHost. Para cada site que utiliza SSL, você deverá criar um VirtualHost no arquivo /etc/apache2/extra/httpd-vhosts.conf com as seguintes diretivas:

<VirtualHost 127.0.0.1:443>
  ServerName <seu-projeto>.dev
  ServerAlias <seu-projeto>.dev
  SSLEngine on
  SSLCertificateFile "/path/para/os/projetos/<seu-projeto>/<seu-projeto>.crt"
  SSLCertificateKeyFile "/path/para/os/projetos/<seu-projeto>/<seu-projeto>.key"
  VirtualDocumentRoot "/path/para/os/projetos/<seu-projeto>"
  ErrorLog "/path/para/os/projetos/logs/error_log"

  <Directory /path/para/os/projetos/<seu-projeto>>
    Options FollowSymLinks
    AllowOverride All
  </Directory>
</VirtualHost>

É necessário criar o certificado SSL para o seu projeto. Para isso, execute o seguinte comando:

λ ~ > openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout <seu-projeto>.key \
    -new \
    -out <seu-projeto>.crt \
    -subj /CN=<seu-projeto>.dev \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:<seu-projeto>.dev')) \
    -days 3650

Esse comando fará várias perguntas sobre o seu certificado. A pergunta mais importante é o Common Name. Você deve responder com <seu-projeto>.dev. Ao acessar o site pela primeira vez, adicione o certificado SSL ao Keychain e marque como Trusted, assim você não receberá o aviso de Certificado não Confiável do seu navegador.

Página de Projetos

7df4cc18-b192-11e5-8b4f-4db70b48a22b

Agora que você tem vários projetos rodando na sua máquina, você pode utilizar minha página de projetos para organizar e listar todos eles. A instalação é bem simples. Na sua pasta de projetos, dê um git clone e renomeie a pasta para o nome que você deseja para sua home. Eu uso home assim a página será acessada em home.dev.

Renomeie o config-sample.php para config.php. Abra o arquivo e na linha:

$dir = array(
  "/Users/jmorais/Sites/Wordpress/*", 
  "/Users/jmorais/.pow/*"
);

Coloque os diretórios do Pow e do Apache, assim os projetos serão carregados na página. A opção $siteoptions permite a configuração individual de cada projeto. Por exemplo:

$siteoptions = array(
  'meu-projeto' => array( 
    'displayname' => 'Meu Projeto', 
    'adminurl' => 'http://meu-projeto.dev/wp-admin', 
    'git-repo' => 'http://github.com/meu/projeto' 
  ),
);

Esse código exibirá o meu-projeto com o nome Meu Projeto e também mostrará o link do GitHub e o link de administração do site (/wp-admin por exemplo, caso seja WordPress).

Você também pode configurar a imagem de cada projeto, bastando colocar o screenshot da página na pasta img/screenshots com o nome projeto-tipo.png. O tipo do projeto pode ser Rails, WordPress ou HTML.

No final fica assim:

Anvil

Sou muito fã do Anvil, um aplicativo que fica no Menu Bar do OS X listando todos os seus projetos do Pow. É uma mão na roda. Mas alguns probleminhas (principalmente envolvendo favicons) me motivaram a modificar o Anvil para melhor me atender. Olha a diferença:

Antes
Screen Shot 2016-02-05 at 4.12.03 AM
Depois
Screen Shot 2016-02-05 at 4.17.08 AM

Umas modificações no código e eu integrei o Anvil com minha pasta de projetos em PHP. Também corrigi os bugs dos favicons. Caso queira utilizar minha versão, baixe o código-fonte aqui e faça o seu build. O único requerimento é que o DocumentRoot do seu Apache seja ~/Sites/php. Ou, se desejar, modifique todas as instâncias dessa string no código-fonte do Anvil para o seu DocumentRoot.

Ícone da pasta Sites

No OS X Snow Leopard, quando você adicionava a pasta ~/Sites como favorito no Finder, ela aparecia com um ícone bonitinho, que lembrava o ícone do Safari, como as pastas de Música e Downloads. Em algum momento decidiram retirar essa feature nas novas versões do OS X e isso me irritava bastante. Odiava aquela pasta genérica (a única) nos meus favoritos.

Pesquisei como o Dropbox fazia para mudar o ícone deles, mas era algum tipo de magia negra vindo direto do Tio do Churrasco. Mas aí finalmente a Apple liberou uma API para editar os ícones no Finder e então fiz um aplicativo que a única função é mudar o ícone da pasta ~/Sites. Você pode baixar aqui.

116822c2-d607-11e5-95dc-ff951e10f4a9

Conclusão

Com esse setup, é possível servir um projeto PHP de forma automática (criando uma pasta em /path/para/os/projetos/) e é possível servir um projeto Rails em apenas um passo (executando powify create "nome-do-projeto"). Completamente sem complicações!

A não ser que apareça algum problema durante as etapas desse tutorial. Aí você está ferrado.