2010-12-04 2 views
3

그것은 루비 OS X 응용 프로그램을 쉽게 만들 수 있습니다 -이 같은 구조를 만들 :루비 배경 OS X 용 응용 프로그램

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

와 XXX로 실행하는 코드를 삽입. 하지만 실행 시간이 눈에 띄기 때문에이 앱이 백그라운드에서 실행되고 앱이 열릴 때 어떤 메소드를 실행 시키길 원합니다. 그래서 앱을 처음 실행하면 코드가 백그라운드에서 실행되고 다른 시간에 실행하면 앱이 실행됩니다. 이미 백그라운드에 있기 때문에 지정된 메소드 만 실행합니다. 최소 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> 
+0

@tig 이것은 아주 좋은 질문이나 팁입니다. xxx가 세 자리에 있고 "xxx로 실행할 코드 넣기"라고하면 3 가지 모두에 대해 동일한 문자열을 사용해야합니까? – Phrogz

+0

@Phrogz :이 구조는 OS X 응용 프로그램의 표준이므로, 실행 파일과 icns 파일의 이름은'Info.plist'에 지정되어 있으며 그 이름은 다를 수 있습니다. 최소한의 Info.plist 내용을 질문에 추가 할 것이다. – tig

+0

@Phrogz : 내 질문에 대해 - 나에게이 앱을 만드는 것은 일종의 해킹 인 것 같습니다. 앱 아이콘 (숨겨지지 않은 경우)은 프로그램이 완료 될 때까지 Dock에서 튀고 여러 번 연속 실행되는 긴 스크립트가있는 앱을 열면 아무것도하지 마라. 그런 앱에서 러닝 루프를 만드는 것은 어렵거나 불가능한 것처럼 보인다. 루비를 사용하여 OS X 앱을 만들고 싶다면 MacRuby를 사용해야 할 것 같습니다. – tig

답변

2

속도 저하는 루비 인터프리터에 필요한 시작 시간 때문이다. 그래서 bash 스크립트 나 objective-c에서는 느리지 않습니다. .

단계 배경 루비 프로그램과 통신 할 수 :

  • 확인하여 루비 프로그램이 daemons gem을 사용 (선택하지만, 배경 쉽게 실행하게)
  • 포트에 텔넷하는 bash는 스크립트를 작성 실행할 때.
  • 루비 프로그램을 실행하려면 eventmachine (Rubygems를 통해 사용 가능) 또는 텔넷을 지원하는 다른 소켓 서버를 실행하십시오.
  • 루비 소켓 서버가 텔넷을 통해 메시지를 받으면 프로그램은 원하는 방법을 실행합니다.
  • 질문에 설명하는 것처럼 응용 프로그램에서 bash 스크립트를 패키지화하십시오.

bash는 스크립트에 있습니다 : 이미 백그라운드에서 실행되고 있지 않은 경우

  1. 시작 루비 프로그램이나 데몬을 시작합니다.
  2. 루비 프로그램에 지정된 포트에서 telnet으로 로컬 호스트에 연결하십시오.
  3. 메소드를 실행하라는 메시지를 보냅니다.
  4. 결과를 저장하거나 인쇄하십시오. 이 솔루션

    • 쉬운에

장점은 구현합니다.

  • 텔넷은 모든 Mac에 자동으로 설치됩니다.
  • 배쉬 스크립트는 사용법을 배우기 쉽습니다.
  • Ruby에는 구현하기 쉬운 소켓 젬과 라이브러리가 있습니다.
  • 경고

    이 지속적으로 루비 인터프리터로 컴퓨터의 메모리를 사용하는 비용이있다. 따라서 사용자 친화적 인 솔루션이 아닙니다.

    루비에서 그래픽 인터페이스로 실제 앱을 만들려면 rubycocoa에서 macruby를 사용해야합니다.

    또는 Appcelerator의 Titanium Desktop을 사용하면 자바 스크립트에서 인터페이스 코드를 작성해야하지만 나머지는 루비로 처리 할 수 ​​있습니다. 이 방법은 또한 크로스 플랫폼이라는 장점이 있습니다. http://developer.appcelerator.com/doc/desktop/ruby

    0

    은 '백그라운드에서 실행'가 무엇을 의미하는지에 따라 다릅니다. 화면을 여는 일없이 화면을 열거 나 닫고 닫으려면 속성 목록을 설정하여 상태 표시 줄 아이콘 cite을 숨기고 닫을 수 있습니다. 사용 자동화 도구를 사용하여 스크립트를 열고 실행하고 닫을 수 있습니다.

    +1

    아니요, 해당 LSUIElement는 이미 사실입니다. 백그라운드에 머물러 있고 다른 시간에 응용 프로그램을 호출 할 때 일부 메서드를 실행한다는 의미입니다. 내 의도는 응용 프로그램을 여는 데 걸리는 시간을 최소화하고 루비 해석기를 시작하는 것입니다. – tig

    0

    이전에 해본대로 작동합니다. (

    > time /usr/bin/open test.app 
    
    real 0m0.042s 
    user 0m0.022s 
    sys  0m0.010s 
    

    그래서 응용 프로그램이 40 밀리 초에서 시작 : 나는 (코드 스크립트가 XXX의 장소에의) 실행 파일과 간단한 스크립트를 테스트 :

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

    그리고 나는 그것을 초과 배경이있는 경우 대략 동시에 반환해야 함). 문제는 응용 프로그램을 여는 방법 (명령 행, 아이콘, applescript ...) 일 수 있습니다. 더 말할 수 있니?

    편집 : 당신이 열 단말기를 사용하는 경우, 당신은 마지막에 '&'기호를 사용할 수 있습니다 (백그라운드 프로세스를 시작합니다). 그렇게하면 셸은 6ms 안에 돌아옵니다.

    BR,

    주하