برنامه نویسی

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

من به تازگی یک گوهر ساخته ام ، 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 می تواند متفاوت باشد. علاوه بر گرفتن این داربست ، همچنین مزایایی دارد ، مانند:

  1. می توانید استفاده کنید bundler برای رسیدگی به وابستگی ها.
  2. شما برای آزمایش و انتشار گوهر وظایف از پیش تعریف کرده اید
  3. مخزن GIT آغاز می شود
  4. و غیره

اطلاعات بیشتر را می توان در 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 روش برای آزمایش سریع گوهر شما وجود دارد.

  1. bin/console: باز می شود irb و گوهر شما را بارگیری می کند ، بنابراین می توانید
  2. 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/

پایان

من فکر می کنم ساختن یک گوهر برای بیشتر توسعه دهندگان یک کار روزانه نیست. با این حال ، سنگهای قیمتی بخش اساسی جامعه روبی هستند. چرا همیشه می توانیم یک گوهر برای نیازهای خود پیدا کنیم؟ به این دلیل است که مردم آنچه را که می سازند به اشتراک می گذارند. چگونه می توانیم به افرادی تبدیل شویم که بتوانند به اشتراک بگذارند؟ دانستن نحوه ساخت گوهر اولین قدم است. امیدوارم این مقاله بتواند احساس کند که یک گوهر ساده تر از آن چیزی است که فکر می کردید. 🙏

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا