2013-09-08 52 views
6

Là lười biếng, tôi muốn chuỗi hai lệnh sau đây để nó sẽ làm việc với một bí danh bash đơn giản.jekyll phục vụ và khởi động

jekyll -w serve 

khởi động máy chủ phát triển cho phiên bản jekyll của tôi.

open "http://localhost:4000" 

khởi chạy ứng dụng jekyll trong trình duyệt mặc định của tôi.

Làm cách nào để kết nối chúng lại với nhau để tôi có thể nhập một bí danh đơn giản trong dòng lệnh của tôi để phân phối và khởi chạy?

GHI CHÚ

  • Lưu ý sử dụng một trong hai && hoặc ; để chuỗi jekyll -w serveopen "http://localhost:4000" sẽ không làm việc vì jekyll -w serve khởi chạy quá trình webrick dai dẳng trong stdout. Điều đó có nghĩa là lệnh thứ 2 open "http://localhost:4000" sẽ không được thực thi vì quá trình đầu tiên (webrick) chưa bao giờ "hoàn thành".

  • Khi webrick bắt đầu, chúng ta có thể nhìn thấy một đầu ra tiêu biểu như sau: -

Configuration file: /Users/calvin/work/calviny/_config.yml 
      Source: /Users/calvin/work/calviny 
     Destination: /Users/calvin/work/calviny/_site 
     Generating... done. 
Auto-regeneration: enabled 
[2013-09-08 18:43:58] INFO WEBrick 1.3.1 
[2013-09-08 18:43:58] INFO ruby 1.9.3 (2013-06-27) [x86_64-darwin11.4.2] 
[2013-09-08 18:43:58] INFO WEBrick::HTTPServer#start: pid=6183 port=4000 
+0

về cơ bản tôi hỏi cùng một câu hỏi, và [đây là một giải pháp làm việc] (http: //stackoverflow.com/a/25177206/704015). –

Trả lời

0

Hiện nay tôi thấy các tùy chọn sau:

  • sử dụng expect để bắt đầu jekyll và sau đó trên trình duyệt tùy thuộc vào một dòng đầu ra nhất định từ jekyll cho thấy việc khởi động trình duyệt ngay bây giờ là an toàn.

  • viết một chương trình nhỏ liên tục cố gắng kết nối với cổng 4000. Nếu một kết nối có thể được thiết lập trong một thời gian nhất định, trình duyệt có thể được bắt đầu. Tất nhiên bạn cũng có thể sử dụng wget hoặc curl và tuần tự cố gắng tải index.html.

  • bạn có thể nhận ra rằng jekyll đã sẵn sàng dựa trên sự hiện diện của một số tệp nhất định. Bạn có thể viết mã gì đó với inotifywait để khởi động trình duyệt sau một tệp như vậy đã được tạo. (Nhưng tôi không biết jekyll, tôi không chắc chắn nếu điều này thực sự là một lựa chọn)

+0

Đây chính xác là những gì tôi đã thử nhưng nó sẽ không hoạt động vì để mở "http: // localhost: 4000" để chạy, 'jekyll -w serve' cần phải được" hoàn thành "- mà nó không phải là từ nó được khởi chạy và chờ đợi các sự kiện tiếp theo. –

+0

bạn có nghĩa là jekyll bắt đầu như một daemon? (Tôi không biết chương trình) – hek2mgl

+0

máy chủ phát triển jekyll là webrick (ruby trên đường ray sử dụng webrick như một máy chủ phát triển quá) và nó không di chuyển sang nền. Khi khởi động, kết quả được hiển thị trên stdout như là một quá trình liên tục. Vì vậy, cho đến khi tôi chấm dứt quy trình webrick bằng lệnh ctrl-c, lệnh thứ hai "mở" http: // localhost: 4000 "' sẽ không thực thi. –

1
function jek { 
    jekyll -w serve & open "http://localhost:4000" 
} 

giải quyết vấn đề. Một đơn &.

+0

làm cách nào để đảm bảo rằng máy chủ web trên cổng 4000 được bắt đầu trước khi trình duyệt sẽ được sinh ra? Nó thực sự giống như khởi động trình duyệt trước khi lệnh jekyll (những gì tôi đã đề nghị ~ giờ trước) bằng cách sử dụng giải pháp này, bạn sẽ cần phải làm mới trình duyệt sau khi máy chủ web đã được bắt đầu – hek2mgl

+0

Bạn nói đúng. Giải pháp này không đủ tốt. :-( –

+0

Tôi đã thêm tùy chọn vào câu trả lời của mình: cổng thăm dò ý kiến ​​4000 và khởi động trình duyệt nếu kết nối có thể được thiết lập. Bạn thậm chí có thể sử dụng wget hoặc curl và thử tải - giả sử index.html - instaed of wrinting một chương trình nhỏ cho điều đó – hek2mgl

0

Tôi không phải là 100% trên các lệnh thiết bị đầu cuối, nhưng điều này dường như đã giải quyết nó cho tôi. Kiểm tra nó một vài lần mà không có vấn đề. (Tôi đang chạy osx 10.8 nếu nó làm cho bất kỳ sự khác biệt cho bạn)

function jek { 
    jekyll -w serve & sleep 5 && open "http://localhost:4000" 
} 
0

Như hek2mgl gợi ý, bạn có thể làm điều này với expect:

set timeout 5 
spawn jekyll serve 
expect { 
    -re {Server address:\s+(.+)$} { 
     set address $expect_out(1,string) 
    } 
} 
expect "Server running..." 
catch { 
    exec xdg-open $address 
} 
interact