2014-01-24 7 views
4

Я пытаюсь построить командную строку . Я использую bundler для создания драгоценного камня и установки драгоценного камня на месте. Он создал необходимые каталоги. Я также смог проверить, что если мне понадобится мой Gem, я могу использовать методы внутри него. Я пытаюсь заставить часть командной строки работать сейчас и, похоже, не может заставить ее работать. Я хочу быть в состоянии сделать что-то вродеИнструмент командной строки Ruby Gem

gemname command 

Подобно тому, как работ:

rspec test/whatever.rb 

Любая помощь о том, как быть в состоянии выполнить с помощью командной строки было бы здорово.

+0

Вы должны сами реализовать инструмент двоичной/командной строки. См. Https://github.com/jimweirich/rake/tree/master/bin для примера – mhutter

+0

Можете ли вы объяснить немного больше? Поэтому я создаю этот исполняемый файл, а затем запускаю установку пакета, и он должен просто работать? Кроме того, когда Rake.application.run используется для команды rake? Нужно ли мне это в моем драгоценном камне? Когда я запускаю mygem mycommand, он просто говорит, что команда не найдена mygem – wallerjake

ответ

0

Checkout эти записи в блоге: http://robdodson.me/blog/2012/06/14/how-to-write-a-command-line-ruby-gem/ http://rubylearning.com/blog/2011/01/03/how-do-i-make-a-command-line-tool-in-ruby/

Я не совсем уверен, что вы построили до сих пор, но здесь есть несколько достопримечательностей:

  1. #!/usr/bin/env ruby для первой линии исполняемый файл (в папке /bin).
  2. chmod +x filname, чтобы сделать его исполняемым
  3. ARGV[0] Переменные, передаваемые в извлекаются из ARGV[0]
  4. s.executables << 'your_file' Добавить исполняемый gemspec
+0

Итак, похоже, что я могу запустить bin/mycommand, но не gemname mycommand. Так ли это, как это работает? Нужно ли мне что-то настраивать, чтобы запустить gemname mycommand? – wallerjake

+0

добавил строку 'executables'. дайте это попробовать – AdamT

+0

Это то, что жемчуг дал мне за это. spec.executables = spec.files.grep (% r {^ bin /}) {| f | File.basename (f)} Неправильно ли это? Должен ли я попытаться разместить конкретный файл? Также мне нужно перезагрузить Gem, выполняющий установку пакета? – wallerjake

2

Для объявлял исполняемых файлов вы должны просто сделать правильную линию в вашей yourgem.gemspec

`git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } 

Эта линия, а также другая полезная строка генерируется командой bundle gem yourgem. Просто выполните его, а затем исправьте yourgem.gemspec в соответствии с вашими потребностями. Поместите исполняемые файлы в папку bin/ вашего драгоценного камня и все библиотеки, включая версию, в папку lib/.

Следующий шаг - использовать двоичный файл. Когда вы устанавливаете в систему, двоичная папка автоматически включается в двоичный путь поиска. Таким образом, ваш драгоценный камень можно выполнить с любого из них. Но когда ваш драгоценный камень не установлен, вы все еще в состоянии simelate случай с Exec «s следующим образом:

bundle exec bin/your_exec 

Он выбирает требуют librarires вверх от Lib/ папку и исполняемый файл будет работать должным образом.

Чтобы убедиться, что исполняемый файл будет работать, создайте драгоценный камень с помощью gem build yourgem.gemspec, затем установите его с помощью gem install yourgem.gem и попробуйте.

+0

Хорошо, так что это работает, когда я использую пакет exec bin/my_exec. Итак, когда я опубликую это ваше высказывание, пользователь сможет просто запустить mygemname mycommand? Могу ли я проверить это локально, прежде чем публиковать его в rubygems? – wallerjake

+0

@wallerjake, конечно, создайте gem 'gem build yourgem.gemspec', а затем установите его' gem install yourgem.gem' –

+0

Да, он говорит, что он установлен, но когда я набираю mymemname mycommand, он говорит, что gemname не найден. Успешно установлен gemname-0.0.1 Синтаксический документация gemname-0.0.1 Установка ри документации для gemname-0.0.1 1 камень установлен – wallerjake

0

Я понял это, по крайней мере, для моей конкретной проблемы. Мне просто нужно вызвать команду bin непосредственно вместо этого цикла git ls. Верхний работает нижний не по какой-то причине.

spec.executables = ["toolshed"]

против

spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }

2

Я думаю, что проблема в том, что вы не поручены код еще. Проверьте, есть ли в файле git ls-files -- bin/* скрипт, который вы хотите выполнить.

Когда вы зафиксируете свой файл, тогда git ls-files вернет его, и спецификация сможет загрузить сценарий.

+0

Я думаю @ Малъ Скрылевъ [ответ] (http://stackoverflow.com/a/21373096/2661448) указывал в том же направлении. Кредиты для него! – delucas

+0

Да, я верю, что вы правы. Я оставил его на данный момент, но я намерен вернуться и снова обновиться. Благодаря! – wallerjake

Смежные вопросы