Nasıl temel bir Ruby projesi kurarım?


103

10 ~ 20 sınıf / dosya içeren küçük bir Ruby projesi oluşturmak istiyorum. Bazı mücevherlere ihtiyacım var ve RSpec'i test çerçevesi olarak kullanmak istiyorum.

Daha sonra bir mücevher inşa etmek isteyebilirim, ama bu kesin değil.

Projemin temel yapısını nasıl kuracağımı bana gösteren nasıl yapılır ya da rehber var mı?

Sahip olduğum sorular:

  • Tüm özel Hataları / İstisnalarımı nereye koyarım?
  • Lib, bin, src gibi dizinleri adlandırmak için bazı kurallar var mı?
  • Test verilerini veya belgelerini nereye koymalıyım?
  • Projemde onlara erişebilmem için tüm dosyalarıma nerede ihtiyacım var?

Her şeyi sıfırdan yapabileceğimi biliyorum, ama biraz rehberlik istiyorum. Kopyalayabileceğim bazı güzel mücevherler var ama gerçekten neye ihtiyacım olduğundan ve neyi silebileceğimden emin değilim.

Ben baktım http://gembundler.com/ ama Bundler kurduktan sonra durur.


Yanıtlar:


156

İyi bir başlangıç ​​yapmak için ve bundle gemkomutunu kullanabilirsiniz rspec --init.

~/code $ bundle gem my_lib
      create  my_lib/Gemfile
      create  my_lib/Rakefile
      create  my_lib/LICENSE.txt
      create  my_lib/README.md
      create  my_lib/.gitignore
      create  my_lib/my_lib.gemspec
      create  my_lib/lib/my_lib.rb
      create  my_lib/lib/my_lib/version.rb
Initializating git repo in /Users/john/code/my_lib
~/code $ cd my_lib/
~/code/my_lib $ git commit -m "Empty project"
~/code/my_lib $ rspec --init
The --configure option no longer needs any arguments, so true was ignored.
  create   spec/spec_helper.rb
  create   .rspec
  • kod girer lib
  • özellikler giriyor spec
  • test verileri veya belgeler giriliyor spec/fixtures/
  • Tüm Ruby dosyalarınızı içeri alın lib/my_lib.rb. İstisnalarınızı o dosyada veya kendi dosyalarında da tanımlayabilirsiniz - kendi tercihinize göre.
  • C kaynak dosyaları girilir ext/my_lib
  • kabuk komut dosyaları ve çalıştırılabilir dosyalar içeri girer bin

Şüphe duyduğunuzda, diğer cevherlerin nasıl yerleştirildiğine bakın.


Daha fazla bilgi:

Diğer geliştiriciler için işleri kolaylaştırmak için rspec'i gemspec'inize geliştirme bağımlılığı olarak eklemelisiniz.

  1. My_lib.gemspec'i ekleyerek gem.add_development_dependency 'rspec've gem.add_development_dependency 'rake'altına yakın bir şekilde düzenleyin.
  2. Spesifikasyonlarınızı çalıştırdığınızda gem bağımlılıklarınızın yüklenmesini sağlamak için spec / spec_helper.rb'nin en üstüne Bundler.setupve ekleyin require 'my_lib'.
  3. Ekle require "rspec/core/rake_task"ve task :default => :speckoşu böylece, senin Rakefile için rakesizin gözlük çalışacaktır.

Siz en yeni eseriniz üzerinde çalışırken, guard-rspec dosyalar değiştikçe spesifikasyonlarınızı otomatik olarak çalıştırarak spesifik arızalar konusunda sizi uyararak size zaman ve güçlük kazandırabilir.

~/code/my_lib $ git add spec/spec_helper.rb
~/code/my_lib $ git commit -am "Add RSpec"
~/code/my_lib $ vim my_lib.gemspec # add guard development dependency
~/code/my_lib $ bundle
~/code/my_lib $ bundle exec guard init
~/code/my_lib $ vim Guardfile # Remove the sections below the top one
~/code/my_lib $ git add Guardfile
~/code/my_lib $ git commit -am "Add Guard"

Yaratımınızdan memnun kaldıktan sonra, onu github'a itin

# create a github repository for your gem, then push it up
~/code/my_lib $ curl -u myusername https://api.github.com/user/repos -d '{"name":"my_lib"}' 
~/code/my_lib $ git remote add origin git@github.com:myusername/my_lib.git
~/code/my_lib $ git push

Ardından, cevherinizi Rubygems.org'da yayınlamaya hazır olduğunuzda, çalıştırın rake release, bu adımlarda size yol gösterecektir.

~/code/my_lib $ rake release

Diğer Referanslar


1
-b, [--bin=Generate a binary for your library.]ile kullanabilirsiniz bundle gem.
Selman Uluğ

Aynı anda hepsinin bundle gem <gem-name> -teşdeğerini yapmak için de kullanabilirsiniz rspec --init.
pioto

1
Ruby projesi nasıl yürütülür. Öğrenci öğretmen zaman çizelgesi için konsol tabanlı bir yakut projesi oluşturdum. Nasıl çalıştırılacağından emin değil misiniz?
rAzOr

11

Rubygems.org'da sizi geleneklere ve bazılarının arkasındaki mantığa tanıtacak güzel kılavuzlar var . Genel olarak, Rubygems adlandırma ve dizin kuralları çoğu Ruby geliştiricisi takip eder.

Yalnızca standart kitaplıkta hata açıklamasına uyan herhangi bir sınıf bulamazsam özel istisna sınıfları oluştururdum. Hata sınıfınızı, onu yükselten sınıf veya modülün altına yerleştirin:

class Parser::Error < RuntimeError; end

begin
  Parser.new(:invalid).parse!
rescue Parser::Error => e
  puts e.message
end

Birim testleri içine ya gitmek /testkullandığınız takdirde Test::Unit, ya içine /speckullandığınız takdirde RSpec. İkincisini tavsiye ederim.

Bundleryük yolunuzu yönetmenin harika bir yoludur. Ortamınızı otomatik olarak yalnızca Gemfileve isteğe bağlı olarak gemspec. Ayrıca require, kodunuzu değerli hale getirmeden kolayca yapmanızı sağlar .

Bununla birlikte, gelecekte kodunuzu bir mücevherde paketleyebileceğinizden, gem özelliklerinin nasıl oluşturulacağını araştırmanızı öneririm . Spesifikasyonunuzu manuel olarak yazmalısınız. Bunu otomatik olarak üretmek için bazı araçlar kullanmayın - bence bunlar, bilgileri gereksiz yere kopyalayan ve kaynak kontrolü ile kullanıldığında hasara yol açan kaba kuvvet yaklaşımlarıdır.

Yararlı bulabileceğiniz bir mücevher yarattım . Bir gemspecdosya verildiğinde , geminizle Rakeçalışmak için, geminizi oluşturma, yükleme ve serbest bırakma görevlerini rubygemsve gitotomatik sürüm etiketleme ile depoyu içeren birçok yararlı görevi tanımlar . Ayrıca, kodunuzu bir irbveya pryoturumda yüklemenin kolay bir yolunu sağlar .

# Rakefile
require 'rookie'

# Run `rake -T` for the complete task list
Rookie::Tasks.new('your_gem.gemspec').define_tasks!

6

İşte en sık gördüğüm kurallar (projenizin adının "foo" olduğunu varsayarak):

  • /lib/foo.rb - Projenin üst düzey ad alanını ve sürümünü tanımlar; gerekli dosyaları gerektirir.
  • / lib / foo / - Hatayla ilgili sınıflar dahil, projeniz için tüm sınıfları içerir.
  • / test / - Projeniz için testler içerir.
  • / spec / - Projenizin özelliklerini içerir.
  • / bin / - Projeniz ikili dosyalara (JAR dosyaları vb.) bağlıysa, genellikle oraya giderler.

Lib / içinde kural, genellikle üst düzey ad alanınızın içindeki her bir alt ad alanı için bir klasör oluşturmaktır. Örneğin, Foo :: Bar :: Baz sınıfı genellikle /lib/foo/bar/baz.rb altında bulunur.

Bazı insanlar sadece Foo :: VERSION sabitini ayarlamak için bir /lib/foo/version.rb dosyası oluşturmayı severler, ancak bunun /lib/foo.rb dosyasında tanımlandığını çok sık gördüm.

Ayrıca, bir mücevher oluşturuyorsanız, aşağıdaki dosyalara ihtiyacınız olacak:

  • / Rakefile - Tırmık görevlerini tanımlar (mücevheri test etme, oluşturma ve itme görevleri gibi).
  • / Gemfile - Gem'in kaynağını tanımlar (diğer olası şeylerin yanı sıra).
  • /foo.gemspec - Geminizi açıklar ve bağımlılıkların bir listesini sağlar.

5

İnternette bir Ruby projesinin nasıl yapılandırılacağına dair bazı kılavuzlar var. Ayrıca, bunu çözmenin en iyi yolu github'a gidip bazı ünlü Ruby projelerini aramak ve "onların" yapılarını kontrol etmektir.

Genel yakut mücevher gereksinimlerinin yanı sıra, daha iyi iş akışı için aşağıdaki araçları öneriyorum:

  • editorconfig , geliştiricilerin farklı düzenleyiciler ve IDE'ler arasında tutarlı kodlama stillerini tanımlamasına ve sürdürmesine yardımcı olur.
  • rubocop , ruby ​​için statik kod analizörü, ruby ​​topluluğunda linter için defac.
  • guard , bir grup eklentiyle birlikte, kod değiştiğinde otomatik olarak istediğiniz komutu çalıştırabilirsiniz.
  • rake , çeşitli proje görevleri için evrensel sürücü, örneğin:
    • package: mücevher paketi inşa et
    • clean: oluşturulan dosyaları temizle
    • test: testi çalıştır
  • yard , popüler yakut dokümantasyon aracı.

Yukarıdaki tüm araçların yanı sıra, Ruby projesi için bazı çevrimiçi hizmetler:

Ayrıca , açık kaynak projeniz için http://shields.io/ aracılığıyla rozetler bile oluşturabilirsiniz .

Bu benim deneyimim, umarım biri için yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.