برخی از نکات برای ساخت یک گوهر یاقوت

من به تازگی یک گوهر ساخته ام ، https://github.com/kevinluo201/fx_rates ، که یک بسته بندی API برای یک سرویس نرخ ارز خوب است ، https://fxratesapi.com/. به هر حال ، آنچه آن گوهر انجام می دهد نکته ای در اینجا نیست. من به سادگی می خواهم تجربه خود را در ساخت یک گوهر یاقوت به اشتراک بگذارم.
برای ساختن گوهر از Bundler استفاده کنید
اول ، من پیشنهاد می کنم استفاده کنید bundler
برای ساخت یک گوهر. البته ، می توانید راهنمای رسمی Rubygem.org's Make Gem خود را دنبال کنید. با این حال ، درست مانند سایر پروژه های مدرن ، شروع به کار از دیگهای بخار بسیار ساده تر خواهد بود. bundler
می تواند دیگهای بخار روبی گوهر را برای ما فراهم کند. فرض کنید گوهایی که می خواهید بسازید نامیده می شود your_gem
بشر شما می توانید گوهر را توسط:
bundle gem your_gem
شما باید یک دایرکتوری مانند زیر دریافت کنید:
tree
.
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│ ├── console
│ └── setup
├── lib
│ ├── your_gem
│ │ └── version.rb
│ └── your_gem.rb
├── sig
│ └── your_gem.rbs
├── spec
│ ├── spec_helper.rb
│ └── your_gem_spec.rb
└── your_gem.gemspec
مال شما به دلیل نسخه های مختلف Bundler می تواند متفاوت باشد. علاوه بر گرفتن این داربست ، همچنین مزایایی دارد ، مانند:
- می توانید استفاده کنید
bundler
برای رسیدگی به وابستگی ها. - شما برای آزمایش و انتشار گوهر وظایف از پیش تعریف کرده اید
- مخزن GIT آغاز می شود
- و غیره
اطلاعات بیشتر را می توان در https://bundler.io/guides/creating_gem.html یافت. اکنون می توانید ویرایش را شروع کنید your_gem_name.gemspec
برای افزودن اطلاعات اصلی برای گوهر و وابستگی های خود.
از زمان استفاده کنید
دوم ، من پیشنهاد می کنم از Zeitwerk Gem برای مدیریت ثابت مانند کلاس ها و ماژول ها از طریق سازماندهی پرونده ها استفاده کنید. من قصد دارم توضیح دهم که چرا.
ما باید ابتدا یک چیز را بدانیم: چه اتفاقی می افتد وقتی که به یک گوهر در روبی نیاز داریم؟ به عنوان مثال ،
require 'a_gem'
این به روبی می گوید که نقطه ورود پرونده یاقوت در آن a_gem
بشر پرونده نقطه ورود در گوهر چیست؟ این همیشه پرونده با همان نام همانطور که گوهر شما زیر است lib/
بشر در مورد ما ، این است lib/your_gem.rb
بعد از اینکه یک گوهر توسط Bundler ایجاد کردیم ، lib/your_gem.rb
پرونده باید به این شکل باشد:
# frozen_string_literal: true
require_relative "your_gem/version"
module YourGem
class Error < StandardError; end
# Your code goes here...
end
بیایید نگاه کنیم require_relative "your_gem/version"
بشر این فقط به معنای بارگیری است lib/your_gem/version.rb
بشر متوجه خواهید شد require 'your_gem
فقط پرونده ورود را بارگیری می کند. برای سایر پرونده های موجود در گوهر ، آنها باید در پرونده نقطه ورود مورد نیاز باشند. هیچ جادویی وجود ندارد. آنها به طور خودکار بارگیری یا متصل نمی شوند.
حال ، فرض کنید ما می خواهیم یک کلاس جدید اضافه کنیم ، YourGem::Configuration
، ما می توانیم آن را در زیر قرار دهیم lib/your_gem/configuration.rb
بشر
├── lib
│ ├── your_gem
│ │ ├── configuation.rb
│ │ └── version.rb
│ └── your_gem.rb
محتوای پرونده می تواند یک کلاس خالی باشد:
# lib/your_gem/configuration.rb
module YourGem
class Configuration
end
end
سپس ما باید در پرونده نقطه ورود به آن نیاز داشته باشیم:
ما باید در نقطه ورود به این پرونده جدید نیاز داشته باشیم:
# frozen_string_literal: true
require_relative "your_gem/version"
require_relative "your_gem/configuration". # <---- this line
module YourGem
class Error < StandardError; end
# Your code goes here...
end
ما می توانیم دریافت کنیم YourGem::Configuration
پس از نیاز به پرونده نقطه ورود. ما می توانیم این روند را برای هر پرونده در گوهر تکرار کنیم. اگرچه بسیار واضح است ، zeitwerk
رویکرد دیگری برای اتوماسیون این فرآیند فراهم می کند.
با zeitwek
، می توان آن را بازنویسی کرد
require "zeitwerk"
loader = Zeitwerk::Loader.for_gem
loader.setup
module YourGem
class Error < StandardError; end
# Your code goes here...
end
YourGem::Configuration
به طور خودکار بارگیری می شود. در واقع ، تمام پرونده های زیر lib/your_gem/**/*
بعد از بارگیری loader.setup
اجرا شده است ، بنابراین شما نیازی به اضافه کردن خط پس از اضافه کردن یک فایل جدید ندارید.
این یک الگوی “کنوانسیون بیش از پیکربندی” است ، بنابراین تمام نام پرونده های شما باید از الگوی زیر پیروی کنند:
lib/my_gem.rb -> MyGem
lib/my_gem/foo.rb -> MyGem::Foo
lib/my_gem/bar_baz.rb -> MyGem::BarBaz
lib/my_gem/woo/zoo.rb -> MyGem::Woo::Zoo
جزئیات بیشتر را می توان در https://github.com/fxn/zeitwerk یافت
پیکربندی را اضافه کنید
برخی از سنگهای قیمتی رابط کاربری را برای تعریف تنظیمات جهانی ، مانند ریل ها فراهم می کنند
Rails.application.configure do
config.eager_loading = false
# other settings
end
به نظر می رسد فوق العاده باحال! ما همچنین می توانیم اجازه دهیم گوهر ما این توانایی را داشته باشد. بیایید بگوییم که می خواهیم جهانی را تعیین کنیم api_key
بشر ابتدا می توانیم یک کلاس برای نگه داشتن تنظیمات ایجاد کنیم. ما می توانیم استفاده کنیم YourGem::Configuration
ما در بالا ایجاد کردیم تا این کار را انجام دهیم:
module YourGem
class Configuration
attr_accessor :api_key
def initialize
@api_key = nil
end
end
end
سپس در نقطه enter_point lib/your_gem.rb
، ما یک دسترسی و روش به سطح ماژول اضافه می کنیم:
module YourGem
class Error < StandardError; end
class << self
attr_accessor :config
def configure
self.config ||= Configuration.new # <--- YourGem::Configuration has been loaded by zeitwerk above
yield(config) if block_given?
end
end
end
با انجام این کار می توانیم بنویسیم و بخوانیم api_key
از طرف
# write
YourGem.configure do |config|
config.api_key = "your-api-key-here"
end
# read
YourGem.config.api_key
# "your-api-key-here"
چگونه قبل از انتشار آن گوهر را آزمایش کنیم؟
البته ، ما می خواهیم بررسی کنیم که گوهر ما قبل از انتشار آن چگونه کار می کند. 2 روش برای آزمایش سریع گوهر شما وجود دارد.
-
bin/console
: باز می شودirb
و گوهر شما را بارگیری می کند ، بنابراین می توانید -
rake install
: این یک کار Rake است که توسط Bundler تنظیم شده است. این یک بسته و invode gem ایجاد می کندgem install pkg/your_gem
برای نصب آن در سیستم. در نتیجه ، شما واقعاً می توانید آن را در سایر پروژه های Ruby خود آزمایش کنیدrequire 'your_gem'
چگونه آن را آزاد کنیم؟
تمام کارهایی که ما برای یک گوهر انجام داده ایم این است که آن را از طریق https://rubygems.org/ منتشر کنیم. برای انتشار گوهر ، به یک حساب کاربری در https://rubygems.org/ اول نیاز دارید. بنابراین ، اگر هنوز این کار را نکرده اید برای یکی ثبت نام کنید.
سپس اجرا کنید rake build
برای ساختن یک فایل گوهر تحت PKG ، باید شبیه آن باشد pkg/your_gem-0.0.1.gem
بشر شماره نسخه 0.0.1
در lib/your_gem/version.rb
بشر سرانجام ، ما تماس می گیریم
gem push pkg/your_gem-0.0.1.gem
و این گوهر را به https://rubygems.org/
پایان
من فکر می کنم ساختن یک گوهر برای بیشتر توسعه دهندگان یک کار روزانه نیست. با این حال ، سنگهای قیمتی بخش اساسی جامعه روبی هستند. چرا همیشه می توانیم یک گوهر برای نیازهای خود پیدا کنیم؟ به این دلیل است که مردم آنچه را که می سازند به اشتراک می گذارند. چگونه می توانیم به افرادی تبدیل شویم که بتوانند به اشتراک بگذارند؟ دانستن نحوه ساخت گوهر اولین قدم است. امیدوارم این مقاله بتواند احساس کند که یک گوهر ساده تر از آن چیزی است که فکر می کردید. 🙏