मैं एक बुनियादी रूबी परियोजना कैसे स्थापित करूं?


103

मैं 10 ~ 20 कक्षाओं / फाइलों के साथ एक छोटी रूबी परियोजना बनाना चाहता हूं। मुझे कुछ रत्नों की आवश्यकता है और मैं टेस्ट फ्रेमवर्क के रूप में RSpec का उपयोग करना चाहता हूं।

मैं बाद में एक मणि का निर्माण करना चाहता हूं, लेकिन यह निश्चित नहीं है।

क्या कुछ ऐसे-कैसे या गाइड हैं जो मुझे दिखाते हैं कि मैं अपनी परियोजना की मूल संरचना कैसे स्थापित करूं?

मेरे पास जो प्रश्न हैं:

  • मैं अपने सभी कस्टम त्रुटियां / अपवाद कहां डालूं?
  • वहाँ कुछ सम्मेलनों नामकरण के लिए बाहर ले जाने के लिए जैसे लिब, बिन, src आदि?
  • मैं परीक्षण डेटा या दस्तावेज़ कहां रखूं?
  • मुझे अपनी सभी फ़ाइलों की आवश्यकता कहां है, इसलिए मुझे अपनी परियोजना में इन तक पहुंच है?

मुझे पता है कि मैं खरोंच से सब कुछ कर सकता हूं, लेकिन मैं कुछ मार्गदर्शन करना चाहूंगा। वहाँ कुछ अच्छे रत्न हैं जिन्हें मैं कॉपी कर सकता हूं, लेकिन मुझे यकीन नहीं है कि मुझे वास्तव में क्या चाहिए और मैं क्या हटा सकता हूं।

मैंने http://gembundler.com/ को देखा , लेकिन बुंडलर की स्थापना के बाद यह रुक गया।


जवाबों:


156

एक अच्छी शुरुआत पाने के लिए, आप bundle gemकमांड का उपयोग कर सकते हैं और 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
  • कोड में जाता है lib
  • ऐनक अन्दर जाती है spec
  • परीक्षण डेटा या दस्तावेज़ अंदर जाते हैं spec/fixtures/
  • में अपने सभी रूबी फ़ाइलों की आवश्यकता है lib/my_lib.rb। आप अपनी पसंद के अनुसार, उस फ़ाइल में, या अपनी खुद की फ़ाइलों में अपने अपवादों को परिभाषित कर सकते हैं।
  • C स्रोत फ़ाइलों में जाते हैं ext/my_lib
  • शेल स्क्रिप्ट और एक्जीक्यूटिव में जाते हैं bin

जब संदेह हो, तो बस यह देखिए कि अन्य रत्न कैसे बिछाए गए हैं।


अग्रिम जानकारी:

अन्य डेवलपर्स के लिए चीजों को आसान बनाने के लिए आपको अपने रत्नों में विकास निर्भरता के रूप में rspec को जोड़ना चाहिए

  1. नीचे जोड़ने gem.add_development_dependency 'rspec'और gem.add_development_dependency 'rake'पास my_lib.gemspec संपादित करें ।
  2. जोड़ें Bundler.setupऔर require 'my_lib'कल्पना / spec_helper.rb के शीर्ष करने के लिए सुनिश्चित करें अपने मणि निर्भरता लोड किए गए हैं जब आप अपने चश्मा चलाते हैं।
  3. जोड़ें require "rspec/core/rake_task"और task :default => :specअपने Rakefile है, ताकि चल रहे rakeअपने चश्मा चलेंगे।

जब आप अपनी नवीनतम रचना पर काम कर रहे होते हैं, तो गार्ड-आरस्पेक आपके चश्मे को स्वचालित रूप से चलाकर आपके समय और परेशानी को बचा सकता है , जो आपको विफलताओं के लिए सचेत करता है।

~/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"

अपनी रचना से खुश होने के बाद, इसे गीथूब तक धकेलें

# 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

फिर, जब आप Rubygems.org पर अपना रत्न जारी करने के लिए तैयार हों, तो दौड़ें rake release, जो आपको चरणों के माध्यम से चलेंगे।

~/code/my_lib $ rake release

आगे के संदर्भ


1
आप के -b, [--bin=Generate a binary for your library.]साथ उपयोग कर सकते हैं bundle gem
सेलमैन उलुग

आप एक ही बार bundle gem <gem-name> -tमें rspec --initसभी के बराबर करने के लिए भी उपयोग कर सकते हैं ।
पियोटो

1
माणिक परियोजना को कैसे निष्पादित किया जाए। मैंने छात्र शिक्षक समय सारिणी के लिए कंसोल आधारित रूबी प्रोजेक्ट बनाया है। निश्चित नहीं है कि इसे कैसे निष्पादित किया जाए ??
rAzOr

11

हैं rubygems.org पर कुछ अच्छा गाइड है कि आप सम्मेलनों और उनमें से कुछ के पीछे तर्क को पेश करेंगे। सामान्य तौर पर, रूबीजीम नामकरण और निर्देशिका सम्मेलनों का पालन अधिकांश रूबी डेवलपर्स द्वारा किया जाता है।

मैं केवल कस्टम अपवाद वर्ग बनाऊंगा यदि मैं मानक लाइब्रेरी में कोई वर्ग खोजने में सक्षम नहीं था तो त्रुटि विवरण फिट बैठता है। अपनी त्रुटि कक्षा को उस वर्ग या मॉड्यूल के अंतर्गत रखें जो इसे बढ़ाता है:

class Parser::Error < RuntimeError; end

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

इकाई परीक्षण या तो अंदर जा रहे हैं /test, यदि आप उपयोग कर रहे हैं Test::Unit, या /specयदि आप उपयोग कर रहे हैं RSpec। मैं बाद की सलाह देता हूं।

Bundlerअपने लोड पथ को प्रबंधित करने का एक शानदार तरीका है। यह स्वचालित रूप से Gemfileऔर वैकल्पिक रूप से निर्दिष्ट केवल निर्भरता के साथ आपके वातावरण को स्थापित करेगा gemspec। यह आपको requireअपने कोड को आसानी से बिना मणि के भी बना सकता है।

हालाँकि, जब आप भविष्य में एक रत्न में अपना कोड बंडल कर सकते हैं, तो मैं जांच करने की सलाह देता हूं कि रत्न विनिर्देशों को कैसे बनाया जाए । आपको अपना विनिर्देश मैन्युअल रूप से लिखना चाहिए। स्वचालित रूप से इसे उत्पन्न करने के लिए कुछ उपकरण का उपयोग न करें - वे हैं, मेरी राय में, जानवर बल दृष्टिकोण की नकल करते हैं जो अनावश्यक रूप से नकल करते हैं और स्रोत नियंत्रण के साथ उपयोग करते समय कहर बरपाते हैं।

मैंने एक रत्न बनाया, जो आपको उपयोगी लग सकता है। एक को देखते हुए gemspecफ़ाइल, यह कई उपयोगी परिभाषित करता है Rakeअपने मणि है, जो, भवन स्थापित करने और करने के लिए अपने मणि को रिहा करने के लिए कार्यों में शामिल हैं के साथ काम करने के लिए कार्यों rubygemsऔर gitस्वचालित संस्करण टैगिंग के साथ भंडार। यह आपके कोड को एक में लोड करने का एक आसान तरीका भी प्रदान करता हैirb या pryसत्र ।

# Rakefile
require 'rookie'

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

6

यहाँ उन सम्मेलनों को देखा जाता है जिन्हें मैंने अक्सर देखा है (आपकी परियोजना का नाम "फू" है)

  • /lib/foo.rb - परियोजना और उसके संस्करण के शीर्ष-स्तरीय नाम स्थान को परिभाषित करता है; आवश्यक फ़ाइलों की आवश्यकता है।
  • / lib / foo / - में आपकी परियोजना के लिए सभी वर्ग शामिल हैं, जिसमें त्रुटि-संबंधित कक्षाएं भी शामिल हैं।
  • / परीक्षण / - आपकी परियोजना के लिए परीक्षण शामिल हैं।
  • / कल्पना / - आपकी परियोजना के लिए चश्मा शामिल है।
  • / बिन / - यदि आपकी परियोजना बायनेरिज़ (JAR फ़ाइलें, आदि) पर निर्भर करती है, तो वे आमतौर पर वहां जाते हैं।

लिब / के अंदर, कन्वेंशन आमतौर पर आपके टॉप-लेवल नेमस्पेस के अंदर प्रत्येक सब-नेमस्पेस के लिए एक फोल्डर बनाने के लिए होता है। उदाहरण के लिए, वर्ग फू :: बार :: बाज आमतौर पर /lib/foo/bar/baz.rb के तहत पाया जाता है।

कुछ लोग Foo :: VERSION को सेट करने के लिए /lib/foo/version.rb फ़ाइल बनाना पसंद करते हैं, लेकिन बहुत बार मैंने इसे /lib/foo.rb फ़ाइल में परिभाषित किया है।

इसके अलावा, यदि आप एक रत्न बना रहे हैं, तो आपको निम्नलिखित फाइलों की आवश्यकता होगी:

  • / रेकफाइल - रेक कार्यों को परिभाषित करता है (जैसे मणि के परीक्षण, निर्माण और धकेलने के लिए कार्य)।
  • / जेमफाइल - रत्न के स्रोत (अन्य संभावित चीजों के बीच) को परिभाषित करता है।
  • /foo.gemspec - आपके मणि का वर्णन करता है और निर्भरता की सूची प्रदान करता है।

5

रूबी परियोजना की संरचना करने के तरीके के बारे में इंटरनेट पर कुछ गाइड हैं। इसके अलावा, मुझे लगता है कि इसे हल करने का सबसे अच्छा तरीका जीथब पर बढ़ रहा है और कुछ प्रसिद्ध रूबी परियोजना की तलाश है, और "उनके" संरचनाओं की जांच करें।

सामान्य रूबी मणि आवश्यकताओं के अलावा, मैं बेहतर वर्कफ़्लो के लिए निम्नलिखित टूल सुझाता हूं:

  • Editorconfig , डेवलपर्स को विभिन्न संपादकों और IDE के बीच लगातार कोडिंग शैलियों को परिभाषित और बनाए रखने में मदद करता है।
  • rubocop , माणिक के लिए स्थिर कोड विश्लेषक, माणिक समुदाय में लिंटर को defac।
  • गार्ड , एक साथ प्लगइन्स के झुंड के साथ, आप जब चाहें कोड बदल सकते हैं, स्वचालित रूप से कोई भी कमांड चला सकते हैं।
  • रेक , विभिन्न परियोजना कार्यों के लिए सार्वभौमिक चालक, जैसे:
    • package: रत्न पैकेज का निर्माण
    • clean: क्लीन जनरेट फाइलें
    • test: चालू परीक्षण
  • यार्ड , लोकप्रिय रूबी प्रलेखन उपकरण।

और उपरोक्त सभी साधनों के अलावा, माणिक परियोजना के लिए उनकी कुछ ऑनलाइन सेवा:

और आप अपने ओपन सोर्स प्रोजेक्ट के लिए http://shields.io/ के माध्यम से बैज भी जेनरेट कर सकते हैं ।

यह मेरा अनुभव है, आशा है कि यह किसी एक के लिए मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.