2012-05-01 30 views
29

Cucumber.js được cung cấp một dòng lệnh "nhị phân" mà là một .js tập tin đơn giản có chứa một công việc hướng dẫn:NPM gói 'bin' kịch bản cho Windows

#!/usr/bin/env node 
var Cucumber = require('../lib/cucumber'); 
// ... 

Các nhị phân được quy định tại package.json với phím cấu hình "bin":

{ "name" : "cucumber" 
, "description" : "The official JavaScript implementation of Cucumber." 
// ... 
, "bin": { "cucumber.js": "./bin/cucumber.js" } 
// ... 

Tất cả đều hoạt động tốt trên hệ thống POSIX. Ai đó đã báo cáo an issue khi chạy Cucumber.js trên Windows.

Về cơ bản, tệp .js dường như được thực hiện thông qua trình thông dịch JScript của Windows (không phải Node.js) và nó ném lỗi cú pháp do lệnh shebang.

Câu hỏi của tôi là: cách được khuyến nghị để thiết lập tập lệnh "nhị phân" hoạt động trên cả hệ thống UNIX và Windows là gì?

Cảm ơn.

Trả lời

44

Windows bỏ qua dòng shebang #!/usr/bin/env node và sẽ thực thi theo liên kết tệp .js. Hãy rõ ràng về việc gọi tập lệnh của bạn bằng nút

node hello.js 

ps. Pedantry: shebangs không phải là trong tiêu chuẩn POSIX nhưng chúng được hỗ trợ bởi hầu hết hệ thống * nix.


Nếu bạn đóng gói dự án cho Npm, hãy sử dụng trường 'bin' trong package.json. Sau đó, trên Windows, NPM sẽ cài đặt một wrapper .cmd cùng side script của bạn vì vậy người dùng có thể thực hiện nó từ dòng lệnh

hello 

Đối NPM để tạo ra các shim đúng, the script must have the shebang line#!/usr/bin/env node

+4

Sự cố là tên tập lệnh nhị phân kết thúc bằng hậu tố ".js". NPM tạo cả tệp nhị phân 'cucumber.js' và' cucumber.js.cmd' thân thiện với cửa sổ dựa trên hướng dẫn cấu hình "bin". Vì cách Windows xử lý các tệp "các phần mở rộng", khi một tệp đã gõ 'node_modules \ .bin \ cucumber.js', nó đang chạy tệp' .js' thông qua JScript thay vì tệp '.cmd'. Cảm ơn bạn đã viết bản ghi chú;) – jbpros

+0

Tôi đã gặp phải vấn đề tương tự. Tôi đang cố gắng tìm một giải pháp không yêu cầu tôi nói cho người dùng Windows gõ một lệnh khác. Các tệp JavaScript làm trống trước tệp .cmd được tạo bởi npm được thực thi trong Windows Script Host; Tôi hy vọng có một cách để tận dụng điều đó để ủy quyền cho CLI do nút hỗ trợ: http: // stackoverflow.com/questions/24113091/tương đương-of-unix-exec-in-jscript-windows-script-host – ELLIOTTCABLE

+0

làm thế nào để tôi thực hiện nó bởi nodejs thay vì microsoft jscript? thậm chí thay đổi nó thành 'node./index.js' không làm cho nó hoạt động. chỉnh sửa: tái thực hiện 'npm link' dường như làm việc –

5

bạn "bin" nên "dưa chuột" npm sẽ tạo tệp "dưa chuột" hoặc "dưa chuột.cmd" trỏ tới "nút% SCRIPTNAME%". trước đây là môi trường posix, thứ hai là dành cho cửa sổ sử dụng ... Nếu bạn muốn "js" là một phần của tên thực thi ... bạn nên sử dụng dấu gạch nối thay thế ... "dưa chuột-js" ... Có tệp .js sẽ xuất hiện trước tệp .js.cmd trong trường hợp của bạn, làm cho trình thông dịch WScript chạy nó dưới dạng tệp JScript chứ không phải tập lệnh nút.

Tôi khuyên bạn nên xem coffee-script's package.json để có ví dụ điển hình.

{ 
    "name":   "coffee-script", 
    "description": "Unfancy JavaScript", 
    "keywords":  ["javascript", "language", "coffeescript", "compiler"], 
    "author":  "Jeremy Ashkenas", 
    "version":  "1.4.0", 
    "licenses":  [{ 
    "type":  "MIT", 
    "url":  "https://raw.github.com/jashkenas/coffee-script/master/LICENSE" 
    }], 
    "engines":  { 
    "node":  ">=0.4.0" 
    }, 
    "directories" : { 
    "lib" : "./lib/coffee-script" 
    }, 
    "main" : "./lib/coffee-script/coffee-script", 
    "bin":   { 
    "coffee":  "./bin/coffee", 
    "cake":  "./bin/cake" 
    }, 
    "scripts": { 
    "test": "node ./bin/cake test" 
    }, 
    "homepage":  "http://coffeescript.org", 
    "bugs":   "https://github.com/jashkenas/coffee-script/issues", 
    "repository": { 
    "type": "git", 
    "url": "git://github.com/jashkenas/coffee-script.git" 
    }, 
    "devDependencies": { 
    "uglify-js": ">=1.0.0", 
    "jison":  ">=0.2.0" 
    } 
}
Các vấn đề liên quan