SBT dừng chạy mà không thoát


120

Làm thế nào để bạn kết thúc một cuộc chạy trong SBT mà không thoát ra?

Tôi đang thử CTRL + C nhưng nó thoát khỏi SBT. Có cách nào để chỉ thoát ứng dụng đang chạy trong khi vẫn mở SBT không?


Ctrl+Dkhông hoạt động.
botchniaque

Tôi nghĩ Ctrl + Dchỉ hoạt động cho Play framework.
EnverOsmanov

Câu trả lời:


44

Trong cấu hình mặc định, các lần chạy của bạn diễn ra trong cùng một JVM mà sbt đang chạy, vì vậy bạn không thể dễ dàng loại bỏ chúng một cách riêng biệt.

Nếu bạn thực hiện quá trình chạy của mình trong một JVM được phân nhánh riêng biệt, như được mô tả tại Forking , thì bạn có thể loại bỏ JVM đó (bằng bất kỳ phương tiện nào mà hệ điều hành của bạn cung cấp) mà không ảnh hưởng đến JVM của sbt:

fork in run := true

9
Tôi đang cố gắng làm điều này. Cụ thể, tôi đã triển khai: stackoverflow.com/questions/3868863/… nhưng sbt vẫn thoát khi tôi thực hiện CTRL + C. Làm cách nào để giết chỉ JVM đã được chia nhỏ?
dsg

2
với killtừ dòng lệnh, hoặc trong Task Manager (Windows), hoặc Force Quit hoặc Activity Monitor (Mac OS X) vv
Seth Tisue

Sau khi forking, giết tất cả mọi thứ java trừ SBT, chạy:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
DSG

1
Tôi thích ý tưởng này, nhưng nó có vẻ không hữu ích. Tôi đang chạy SBT 0.13.1 và thêm dòng này vào tập tin build.sbt của tôi ..
doub1ejack

bạn cần giết nó runbằng CTRL + D
Timofey

82

Từ phiên bản sbt 0.13.5, bạn có thể thêm vào build.sbt của mình

cancelable in Global := true

Nó được định nghĩa là "Cho phép (đúng) hoặc vô hiệu hóa (sai) khả năng làm gián đoạn việc thực thi tác vụ bằng CTRL + C." trong định nghĩa Keys

Nếu bạn đang sử dụng Scala 2.12.7+, bạn cũng có thể hủy biên dịch bằng CTRL + C. Tham khảo https://github.com/scala/scala/pull/6479

Có một số lỗi được báo cáo:


5

Tôi thấy điều sau hữu ích khi tôi có quyền kiểm soát vòng lặp chính của ứng dụng đang được chạy từ sbt.

Tôi yêu cầu sbt fork khi chạy ứng dụng (trong build.sbt):

fork in run := true

Tôi cũng yêu cầu sbt chuyển tiếp stdin từ trình bao sbt đến ứng dụng (trong build.sbt):

connectInput in run := true

Cuối cùng, trong chuỗi chính của ứng dụng, tôi đợi end-of-file trên stdin và sau đó tắt JVM:

while (System.in.read() != -1) {}
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)

Tất nhiên, bạn có thể sử dụng bất kỳ luồng nào để đọc stdin và tắt máy, không chỉ luồng chính.

Cuối cùng, khởi động sbt, tùy chọn chuyển sang dự án con muốn chạy, chạy.

Bây giờ, khi bạn muốn dừng quá trình, hãy đóng stdin của nó bằng cách gõ CTRL-D trong trình bao sbt.


1

Cân nhắc sử dụng sbt-Revver . Chúng tôi sử dụng nó trong công ty của chúng tôi và nó thực sự tiện dụng. Đối với những gì bạn đang yêu cầu có thể được thực hiện với:

reStart

reStop

Mà không cần cấu hình tệp build.sbt.

Bạn có thể sử dụng plugin này bằng cách thêm:

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

Đối với dự án / plugins.sbt của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.