Ruby фоновое приложение OS X - PullRequest
       7

Ruby фоновое приложение OS X

3 голосов
/ 05 декабря 2010

Создать приложение ruby ​​OS X легко - создайте структуру, подобную этой:

xxx.app
└── Contents
    ├── Info.plist
    ├── MacOS
    │   └── xxx
    └── Resources
        └── xxx.icns

и поместите код для выполнения в ххх. Но время запуска заметно, поэтому я хочу, чтобы это приложение оставалось в фоновом режиме и запускало какой-то метод при открытии приложения: поэтому, когда я запускаю это приложение в первый раз, оно выполняет код, оставаясь в фоновом режиме, когда я запускаю в другой раз, приложение уже в фоновом режиме, поэтому он просто запускает указанный метод.

Минимальный Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>CFBundleExecutable</key>
  <string>newTabHere</string>
  <key>CFBundleIconFile</key>
  <string>newTabHere</string>
  <key>LSUIElement</key>
  <true/><!-- hides icon from Dock -->
</dict>
</plist>

Ответы [ 3 ]

2 голосов
/ 11 декабря 2010

Замедление происходит из-за времени запуска, необходимого для интерпретатора ruby.Вот почему для bash-скрипта или target-c он не медленен.

Шаги для связи с фоновой программой ruby:

  • Использование вашей программы ruby гем демонов . (необязательно, но облегчает работу в фоновом режиме)
  • При запуске запишите bash-скрипт для telnet на порт.
  • Запустите программу ruby ​​ eventmachine (доступно через Rubygems) или другой сервер сокетов, поддерживающий telnet.
  • Когда сервер сокетов ruby ​​получает сообщение через telnet, программа должна запустить нужный метод.
  • Упакуйте скрипт bash в приложение, как вы описали в своем вопросе.

Скрипт bash должен:

  1. Запустить программу ruby ​​или запуститьдемон, если он еще не работает в фоновом режиме.
  2. Подключитесь с помощью telnet к localhost через порт, указанный в программе ruby ​​
  3. Отправьте сообщение для запуска метода.
  4. Сохранить или распечатать результат.

Преимущества этого решения

  • Простота реализации.
  • Telnet автоматически устанавливается на всех компьютерах Mac.
  • Скрипты Bash просты в освоении.
  • В Ruby есть хорошие сокеты и библиотеки, которые легко реализовать.

Предупреждение

Это имеет стоимость постоянного использования памяти компьютера с помощью переводчика ruby.Таким образом, это не удобное решение.

Чтобы создать настоящее приложение с графическим интерфейсом в ruby, вы должны использовать macruby с rubycocoa.

Или используйте Titanium Desktop от Appcelerator, вам придется написать код интерфейса в javascript, но вы можете сделать все остальное с помощью ruby.Этот метод также имеет преимущество кроссплатформенности.см http://developer.appcelerator.com/doc/desktop/ruby

0 голосов
/ 10 декабря 2010

Это должно работать так, как вы это сделали. Я проверил его с помощью простого скрипта как исполняемого (в вашем коде скрипт вместо xxx):

#!/bin/sh
a=0
echo $a >> /tmp/test.txt

И я рассчитал это:

> time /usr/bin/open test.app

real    0m0.042s
user    0m0.022s
sys     0m0.010s

Таким образом, приложение запускается через 40 мс (и если фоновое, оно должно возвращаться примерно в то же время). Проблема может заключаться в том, как вы открываете приложение (командная строка, значок, applecript ...). Не могли бы вы рассказать больше?

edit: Если вы используете терминал для открытия, вы можете использовать знак '&' в конце (запускает фоновый процесс). Если я это сделаю, оболочка вернется через 6 мс.

ш

Юха

0 голосов
/ 05 декабря 2010

Зависит от того, что вы подразумеваете под «работать в фоновом режиме».Чтобы он открывался, делал свое дело и закрывался, не захватывая экран каким-либо образом, вы, возможно, могли бы настроить список свойств, чтобы скрыть значок строки состояния cite и закрыть.Вы можете использовать команду automator для открытия, запуска скрипта и закрытия.

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