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

من به تازگی یک گوهر ساخته ام ، 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/
پایان
من فکر می کنم ساختن یک گوهر برای بیشتر توسعه دهندگان یک کار روزانه نیست. با این حال ، سنگهای قیمتی بخش اساسی جامعه روبی هستند. چرا همیشه می توانیم یک گوهر برای نیازهای خود پیدا کنیم؟ به این دلیل است که مردم آنچه را که می سازند به اشتراک می گذارند. چگونه می توانیم به افرادی تبدیل شویم که بتوانند به اشتراک بگذارند؟ دانستن نحوه ساخت گوهر اولین قدم است. امیدوارم این مقاله بتواند احساس کند که یک گوهر ساده تر از آن چیزی است که فکر می کردید. 🙏



