2010-03-17 26 views

Trả lời

23

Thông thường bạn sẽ muốn sử dụng cùng một phương pháp mà bạn sử dụng với mã thư viện, mà là để use/require không gian tên của bạn (thông qua một hình thức ns ở phía trên cùng của tập tin và đôi khi các hàm use/require tại REPL). Để làm việc này, bạn phải chắc chắn rằng họ đang trên classpath. Hướng dẫn ngắn đến rằng:

  1. Thực hiện theo các cấu trúc dự án Clojure thông thường: một thư mục src/ chứa tất cả các file nguồn của bạn, nơi tập src/foo/bar/baz.clj định nghĩa một không gian tên gọi là foo.bar.baz. Lưu ý rằng bạn phải duy trì cấu trúc thư mục/thư mục cấu trúc tên không gian tên; mọi thứ sẽ không hoạt động. Cũng lưu ý rằng bạn không được sử dụng ký tự _ trong tên không gian tên hoặc - ký tự (dấu gạch nối) trong tên tệp và bất cứ khi nào bạn sử dụng _ trong tên tệp, bạn phải sử dụng tên - trong tên không gian tên (và cách khác.) hệ thống phân cấp thư mục sẽ phức tạp hơn một chút với các dự án Maven, nhưng đừng lo lắng về điều này ngay bây giờ (trừ khi bạn đã là người dùng thành thạo Maven, trong trường hợp này, đây không phải là vấn đề với bạn).

    Cũng xem this answer of mine cho câu hỏi SO cũ hơn về xử lý đường dẫn lớp Java với Clojure để có giải thích từng bước chi tiết hơn về hệ thống phân cấp hệ thống phân cấp/phân cấp đường dẫn lớp.

  2. Nếu mã của bạn từ namespace foo.bar cần phải sử dụng mã từ namespace foo.quux.baz, làm điều gì đó như (ns foo.bar (:require [foo.quux.baz :as baz])) trong foo/bar.clj và gọi chức năng từ baz như baz/some-function. Hoặc bạn có thể đặt (:use foo.quux.baz) ở dạng ns thay vì gọi trực tiếp cho họ (không có bộ định danh không gian tên, ví dụ: some-function). Đó chính xác là điều bạn làm cho mã thư viện.

Khi làm việc với mã của dự án của bạn từ REPL, chắc chắn rằng bạn bao gồm src/ thư mục (thư mục riêng của mình, không phải bất kỳ các tập tin trong đó) trên classpath. Bạn có lẽ nên xem xét sử dụng một số công cụ để tự động hóa thiết lập REPL (bao gồm quản lý classpath) cho bạn; Leiningen là rất phổ biến với Clojurians và có bổ sung cho việc sử dụng Maven với Clojure quá.

Cảnh báo: Lệnh khởi chạy JVM của bạn có thể (trên thực tế, có thể sẽ) nhận ra biến môi trường có tên $CLASSPATH. Đối với mối quan hệ của nó với các dự án Clojure của bạn, tốt, về cơ bản không nên có. Nhiều khả năng là không, các dự án của bạn sẽ yêu cầu một classpath khác nhau, một số có thể sử dụng các phiên bản của một số lọ không tương thích với các phiên bản khác (đặc biệt nếu bạn đang sử dụng Clojure 1.1 - bản phát hành ổn định mới nhất - cho một số dự án, trong khi thử nghiệm với 1,2 ảnh chụp nhanh với người khác). Do đó, cách quản lý đường dẫn lớp chính xác là chuẩn bị một phiên bản tối thiểu cho từng dự án và chuyển nó cho lệnh khởi chạy JVM.Như đã đề cập trước đó, bạn nên đầu tư một chút thời gian để học cách sử dụng một công cụ tốt (như Leiningen đã đề cập ở trên) để thiết lập classpath cho bạn càng sớm càng tốt để bạn không cần phải quan tâm đến điều này.

(Như một mặt lưu ý, bạn có thể có thêm nhiều hơn chỉ là thư mục src/jar bạn s vào classpath trong một số tình huống, ví dụ như nếu bạn có kế hoạch kêu gọi compile để sản xuất .class file, bạn sẽ cần phải đặt thư mục đích trên classpath quá. Đó là vượt quá phạm vi của câu hỏi này, mặc dù.)

BTW, tôi đã bắt đầu câu trả lời này với từ "bình thường", bởi vì bạn cũng có thể sử dụng những thứ như load & in-ns chia một không gian tên duy nhất thành nhiều tệp. Hầu hết thời gian này sẽ không phải là những gì bạn thực sự muốn làm, mặc dù; chỉ cần sử dụng bố cục không gian tên cũng được nghĩ ra thay thế.

+1

Bạn cũng có thể đề cập đến điều gì đó về CLASSPATH, tôi nghĩ rằng đó là một trong những bit khó hiểu hơn cho người dùng mới. –

+0

@Brian: Cảm ơn bạn đã đề xuất! Phải mất một thời gian để tôi nhận ra bạn đang đề cập đến '$ CLASSPATH'-the-environment-variable (mà bạn đang có, phải không? :-)), nhưng tôi đã chỉnh sửa câu trả lời để bao gồm một số thông tin về nó (thêm vào một vài bit không liên quan trong khi tôi đã ở đó). –

Các vấn đề liên quan