2012-03-23 11 views
7

मान लें कि मैं net.aserve और bordeaux-threads के शीर्ष पर एक एप्लिकेशन बना रहा हूं। मेरे पैकेज घोषणा इस प्रकार दिखाई देंगे:एक Quicklisp QUICKLOAD मेरे स्रोत में कहां जाना चाहिए? कहीं भी नहीं?

(defpackage :my-package 
    (:use :cl :net.aserve :bordeaux-threads) 
    (:export …)) 

मैं Quicklisp उपयोग करते हैं, इसलिए मैं अपने पैकेज संकलन से पहले कीचड़ में (ql:quickload "aserve") (ql:quickload "bordeaux-threads") चलाने के लिए, और सब कुछ ठीक है।

बेशक, कल मैं फिर से एसएलईएमई शुरू करता हूं और मुझे संकलन करने से पहले QUICKLOAD एस जारी करना याद रखना होगा, अन्यथा मैं परेशानी में हूं।

मैं मेरी के शीर्ष पर की तरह

(eval-when (:compile-toplevel) 
    (ql:quickload "aserve") 
    (ql:quickload "bordeaux-threads")) 

कुछ डाल सकता है पैकेज-यह मैं के लिए क्या किया है विकास-लेकिन मैं एक महसूस कर रही है यह एक अच्छा विचार पर एक पैकेज प्रबंधक मजबूर करने के लिए नहीं है एक उपयोगकर्ता।

क्या कोई बेहतर विकल्प है?

+1

क्या आप इसे अपनी .clinit.cl फ़ाइल में डाल सकते हैं? Http://www.franz.com/support/documentation/6.2/doc/startup.htm#init-files-1 देखें। –

+0

@ जॉन पिक मैं कर सकता था, हालांकि मैं एलेग्रो सीएल नहीं चला रहा हूं, लेकिन एसबीसीएल के पास शायद बराबर है। – Ashe

+0

(वास्तव में, '.sbclrc') मुझे लगता है कि यह शायद मेरी सबसे अच्छी शर्त है- मुझे यह एहसास है कि यह किसी भी तरह दयालु है कि मुझे इसे प्रत्येक स्टार्टअप पर चलाने के लिए है, लेकिन मेरे दिमाग के पीछे कुछ मुझे बताता है कि मैं क्या मैं देख रहा हूं कि यह भी समझ में नहीं आता है - इसलिए "कहीं नहीं?" प्रश्न शीर्षक में, मुझे लगता है! – Ashe

उत्तर

11

अपने asd फ़ाइल में, आप परिभाषित करना चाहिए के रूप में नीचे realtion निर्भर करता है: ''

(asdf:defsystem #:aserve 
:serial t 
:depends-on (#:hunchentoot :hunchentoot-cgi 
      #::bordeaux-threads 
      #:parenscript) 
...) 

के बाद तो आप (QL: quickload: Aserve) की जरूरत है।

+0

मैं 'aserve' नहीं लिख रहा हूं, मैं इसे उपभोग करने की कोशिश कर रहा हूं- और बस चल रहा हूं' (ql: quickload: aserve) 'मैन्युअल रूप से मैं बचने की कोशिश कर रहा हूं! – Ashe

+0

@ आर्लनकस: 'शिकारी टोट' या 'बोर्डो-थ्रेड' जैसी निर्भरताओं की सूची में बस 'aserve' जोड़ें, फिर जब आप इस सिस्टम को लोड (या क्विकलोड) करेंगे, तो यह निर्भरता लोड करेगा। दरअसल यह मूल रूप से क्विकलिस्प करता है, यह एएसडीएफ का उपयोग करता है और अनुपलब्ध निर्भरता डाउनलोड करता है। – Daimrod

+3

यह पूछे गए प्रश्न का सही जवाब है; स्वीकार्य उत्तर एक अलग प्रश्न का उत्तर है (मुझे यकीन नहीं है कि वास्तव में क्या है)। – Xach

10

अपने आवेदन के लिए सिस्टम बनाने के लिए quickproject ((ql:quickload :quickproject) के माध्यम से सुलभ) का उपयोग करें। जैसा कि z_axis वर्णित है, आप defsystem घोषणा में निर्भरताओं की सूची भर सकते हैं (यदि आप quickproject:make-project कहलाते हैं तो आप किसी को याद करते हैं)।

यदि आप क्विकलिस्प इंस्टॉलेशन के local-projects पथ में अपना नया प्रोजेक्ट बनाते हैं, तो आप अपनी प्रोजेक्ट को भी तेज़ कर सकते हैं (भले ही यह क्विकलिस्प वितरण का हिस्सा न हो)। आपकी परियोजना को क्विकलोड करना निश्चित रूप से निर्भरता डाउनलोड करेगा (यदि वे क्विकलिस्प वितरण का हिस्सा हैं), तो उन्हें लोड करें।

+0

z_axis implied (?) के रूप में, मैं इसे तब तक लोड कर सकता हूं जब '.asd' एक ही निर्देशिका में है। – Ashe

+0

आपकी प्रोजेक्ट के समान निर्देशिका में, और यदि आपकी प्रोजेक्ट निर्देशिका 'स्थानीय-परियोजनाओं' निर्देशिका का प्रत्यक्ष बच्चा है। लिंक किए गए ब्लॉग पोस्ट (http://blog.quicklisp.org/2011/11/november-quicklisp-updates.html) से ज़ैच के निर्देशों का पालन करें। –

+0

ओह वाह, 'स्थानीय-परियोजनाओं' पर उस लिंक को पूरी तरह याद किया। धन्यवाद! – Ashe

2

मेरे पास बिल्कुल वही प्रश्न था और मैं सहमत हूं कि मुझे किसी उपयोगकर्ता पर पैकेज प्रबंधक को मजबूर नहीं करना चाहिए। Quicklisp के समय से पहले मैं clbuild का उपयोग कर रहा था और यह सभी .asd फ़ाइलों को एक सिस्टम/निर्देशिका में डालता है। जब तक 'सिस्टम /' निर्देशिका asdf में है: केंद्रीय-रजिस्ट्री, कम से कम एसबीसीएल और सीसीएल में, सभी प्रासंगिक पैकेज लोड करने के लिए, केवल (एक "पैकेज" की आवश्यकता होती है) की आवश्यकता होती है। नया clbuild2 इस सुविधा को बरकरार रखता है यदि आप इंस्टॉल-अप-अपस्ट्रीम करते हैं, और इसकी एकीकृत क्विकलिप अलग-अलग स्थापित-से-अपस्ट्रीम पैकेज का सम्मान करता है, लेकिन Quicklisp स्थापित संकुल अब उनकी .asd फ़ाइलों का पर्दाफाश नहीं करते हैं।

तो मेरा समाधान एक शेल स्क्रिप्ट लिखना है जो सभी Quicklisp स्थापित संकुल स्कैन करता है, आमतौर पर डिस्प्ले/quicklisp/सॉफ्टवेयर/के तहत, और सभी .asd फ़ाइलों को केंद्रीय स्थान पर लिंक करें। इस तरह से किसी को केवल cll छवि में quicklisp लोड करने की आवश्यकता नहीं है अगर कोई केवल quicklisp स्थापित संकुल का उपयोग करना चाहता है। मुझे उम्मीद है कि quicklisp डिफ़ॉल्ट रूप से इस सुविधा को भेज सकता है।

2

यदि आप तैनात स्रोत कोड में एक quicklisp कॉल शामिल नहीं करना चाहते हैं, तो शेष स्रोत से Quickproject सिस्टम परिभाषा फ़ाइल को अलग करें।

स्रोत के शीर्ष पर, defpackage कॉल से ठीक पहले, अपने पैकेज निर्भरताओं के लिए आवश्यक (require ...) जोड़ें। यह गारंटी देता है कि आगे बढ़ने से पहले उन lisp संकुल लोड किए गए हैं (लेकिन किसी भी तरह), लेकिन यह निर्दिष्ट नहीं करता कि 'पैकेज' कैसे लोड हो जाते हैं।उन्हें ql:quickload :my-package कॉल (Quickproject का उपयोग करके) चलाकर लोड किया जा सकता है, जो पहले निर्भरताओं को लोड करेगा, और फिर स्रोत लोड करते समय आवश्यक कॉल के माध्यम से चलाएगा। या संभवतः कोई उपयोगकर्ता सीधे स्रोत लोड कर सकता है (ql:quickload पर कॉल किए बिना), और निर्भरता कॉल आवश्यकता के दौरान लोड की जाएगी, यदि उन निर्भरताओं को *module-search-path* पर पाया जा सकता है। जैसा कि आपने कहा था, यह तकनीक अंतिम उपयोगकर्ता को आपके स्रोत को लोड करना चाहता है जो भी निर्माण उपकरण का उपयोग करने की अनुमति देगा।

कुछ मिनट के लिए इस के साथ प्रयोग करने के बाद, यह quicklisp आवश्यकता समारोह कॉल में latches है, ताकि quicklisp स्थापित किया गया है, तो लगता है, और (require :bordeaux-threads) उदाहरण के लिए, कहा जाता है, तुतलाना quicklisp डाउनलोड करने और है कि निर्भरता स्थापित करने के लिए प्रयोग करेंगे। यह एक बहुत अच्छी सुविधा है (आईएमओ), क्योंकि यह इंटरफ़ेस परत के रूप में कार्य करने के लिए सामान्य लिस्प मानक require फ़ंक्शन की अनुमति देता है, और निर्भरता को पूरा करने के लिए उपयोग किए जाने वाले विशिष्ट निर्माण टूल को सारणीबद्ध करता है। क्विकलिस्प आवश्यकता में लूट सकता है, इसमें asdf latches (आईआईआरसी), आदि

तो अपने प्रश्न का उत्तर देने के लिए, क्विकलिस्प कॉल को तैनात स्रोत कोड में कहीं भी नहीं जाना चाहिए, और requires का उपयोग यह सुनिश्चित करने के लिए किया जाना चाहिए कि निर्भरताएं लोड हों पैकेज परिभाषा फ़ाइल का मूल्यांकन करने से पहले। यदि किसी ने पैकेज परिभाषा फ़ाइल लोड करने से पहले Quicklisp स्थापित किया है, तो निर्भरता डाउनलोड करने और स्थापित करने के लिए Quicklisp का उपयोग करके उनसे संतुष्ट हो जाएगा। अगर किसी ने asdf इंस्टॉल किया है, तो उन निर्भरताओं को उस बिल्ड टूल से संतुष्ट किया जाएगा। और अगर किसी के पास निर्भरताएं पहले से स्थापित हैं (कुछ अन्य तकनीक का उपयोग कर), तो आवश्यकताएं पूरी तरह से पारित हो जाएंगी।