Как создать гем Rails с установкой условной зависимости - PullRequest
3 голосов
/ 24 февраля 2020

Я пытаюсь написать свой первый драгоценный камень и хочу создать тот, который обеспечивает функциональность для dry -под сериализации. В данный момент я использую один драгоценный камень и не предвижу никаких проблем с ним, но я хотел бы иметь возможность добавить поддержку нескольких драгоценных камней сериализации. Единственный недостаток, который я вижу, это то, что для этого потребуется добавить их в список зависимостей и установить их в проект, использующий камень, который я пишу.

Есть ли способ, используя инициализатор, установить предпочтительный камень что пользователь может захотеть использовать и установить только один, а не какой-либо другой?

Сейчас я напишу это без этой функциональности, но в будущем я хотел бы сделать это более надежный с поддержкой нескольких драгоценных камней.


Я обновил генератор установки, который создает инициализатор со списком драгоценных камней по умолчанию, а также то, что я думал, будет работать для динамического добавления зависимости. Мой тест успешно пройден, и я могу выполнить локальную сборку без каких-либо проблем, и мой драгоценный камень, кажется, работает как положено, но когда я пытаюсь перевести sh в gemfury, я теперь получаю ошибку:

remote: Initializing build: done.        
remote: ----→ Building package...        
remote:        RubyGem build detected        
remote:        Invalid gemspec in [/build/app/my_gem.gemspec]: cannot load such file -- blueprinter        
remote:        ERROR:  Error loading gemspec. Aborting.

И в моем gemspe c

spec.add_dependency MyGem.configuration.serializer || 'blueprinter'

Вот код, соответствующий текущей попытке конфигурации:

# lib/my_gem

require "my_gem/version"
require 'my_gem/configuration'
require "my_gem/blueprinter"

module MyGem

  class << self
    attr_accessor :configuration
  end

  def self.configuration(&block)
    @configuration ||= Configuration.new
  end

  def self.configure
    yield(configuration)
  end
end

# lib/my_gem/configuration

module MyGem
  class Configuration
    attr_accessor :serializer

    def initialize
      @serializer = nil
    end
  end
end

1 Ответ

0 голосов
/ 25 февраля 2020

Я пока не смог по-настоящему понять внедрение зависимостей. Поэтому я попытался принять то, что предложил @engineersmky, и создал установку для драгоценных камней. Так что сейчас у меня есть это как мой генератор установки

require 'generators/base_generator'

module MyGem
  module Blueprinter
    class InstallGenerator < BaseGenerator
      source_root File.expand_path("../../../templates", __FILE__)

      # Add blueprinter gem to gemfile after my_gem declaration and bundles the newly declared gem
      def install_blueprinter
        remove_other_supported_gems('ActiveModelSerializers', 'FastJsonapi')
        puts 'Installing Blueprinter...'
        insert_into_file('Gemfile',
                         "\ngem 'blueprinter'",
                         after: "gem 'dry_serialization', source: 'https://gem.fury.io/my_private_gems/'")
        run 'bundle install'
      end


      def helper_include
        copy_api_controller
        gsub_file(API_CONTROLLER_PATH, /^\t*(include MyGem::.*)\n/, '')
        puts 'Adding include statement to ApiController'
        insert_into_file(API_CONTROLLER_PATH,
                         "\n\tinclude MyGem::Blueprinter",
                         after: 'class ApiController < ActionController::API'
        )
      end

    end
  end
end

Получает вызов с помощью rails g my_gem::blueprinter::install Это создает ApiController, который наследуется от ActionController :: Base, если он еще не существует, вставляет gem 'blueprinter' в gemfile после Объявление my_gem удаляет ссылки на другие гемы сериализатора, а затем связывает их для установки гема.

Я хотел бы разделить свои контроллеры на api и приложение, чтобы разделить проблемы, если я выберу монолитное приложение: D

Затем вы можете использовать высушенные методы, которые я создаю в каждом файле для каждого соответствующего драгоценного камня: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...