Leiningen - จะเพิ่มการอ้างอิงสำหรับไหในพื้นที่ได้อย่างไร?


117

ฉันต้องการใช้ leiningen เพื่อสร้างและพัฒนาโครงการ clojure ของฉัน มีวิธีแก้ไข project.clj เพื่อบอกให้เลือกไหจากไดเรกทอรีในเครื่องหรือไม่

ฉันมีกระปุกที่เป็นกรรมสิทธิ์ซึ่งไม่สามารถอัปโหลดไปยัง repos สาธารณะได้

นอกจากนี้ยังสามารถใช้ leiningen เพื่อดูแลไดเรกทอรี "lib" สำหรับโครงการ clojure ได้หรือไม่ หากโครงการ clojure ของฉันจำนวนมากใช้ขวดโหลเดียวกันฉันไม่ต้องการเก็บสำเนาแยกต่างหากสำหรับแต่ละโครงการ

ขอบคุณ


1
ขอบคุณทุกคน ตามที่ได้ชี้ให้ทุกคนของฉันเห็นนี่เป็นปัญหาที่หนักหน่วงและยังไม่มีคำตอบที่ชัดเจน
signalseeker

คำตอบ:


38

คุณสามารถใส่ขวดโหลส่วนตัวของคุณlib/และพวกมันจะอยู่บน classpath เพื่อจุดประสงค์lein swankและอื่น ๆ สิ่งนี้ดูเหมือนจะเอาชนะจุดที่ใช้เครื่องมือการจัดการการพึ่งพาแม้ว่าคุณไม่ต้องการให้มีการจัดการการอ้างอิงเหล่านั้นจริงๆคุณสามารถถือว่า Leiningen เป็น "เครื่องมือการจัดการการพึ่งพาโอเพ่นซอร์ส" และอาจต้องระวังด้วยlein cleanและอาจจะต้องระวังด้วย

เมื่อสถานการณ์ซับซ้อนขึ้น - มีไหส่วนตัวจำนวนมากที่เกี่ยวข้องพวกมันมีวิวัฒนาการและคุณต้องนำข้อมูลการกำหนดเวอร์ชันมาพิจารณาด้วย - แนวคิดของ Arthur ในการสร้าง Maven repo ส่วนตัวอาจเหมาะสมกว่า


(HR หมายถึงจุดตัดชิ้นส่วนเฉพาะของ Leiningen ... ดูข้อมูลต่อด้านล่างเกี่ยวกับเรื่องราวเครื่องมือการจัดการการสร้าง / การพึ่งพาทั่วไปใน Clojure land รวมถึงลิงก์บางส่วนที่ฉันคิดว่าอาจมีประโยชน์ในสถานการณ์ของคุณ)

นอกจากนี้ในขณะนี้ยังไม่มีข้อตกลงสากลเกี่ยวกับคำถามที่เป็นเครื่องมือสร้างที่ดีที่สุดสำหรับ Clojure และ Leiningen ในขณะที่ได้รับความสนใจก็ยังได้รับความสนใจอย่างต่อเนื่องในด้านคุณสมบัติและการขัดเงา - โดยเฉพาะอย่างยิ่งความหมายนั้น ยังไม่เสร็จสมบูรณ์ นี่คือคำพูดจาก Stuart Halloway ผู้เขียน "Programming Clojure" ของ Pragmatic Bookshelf: "2c ของฉัน: Leiningen เป็นขั้นตอนที่สำคัญ แต่ยังมีอีกมากที่ต้องทำ" สำหรับการโพสต์แบบเต็มและการสนทนาที่น่าสนใจเกี่ยวกับการสร้างเครื่องมือและอื่น ๆ ในพื้นที่ Clojure โปรดดูที่ไฟล์ไลนิงเงน, Clojure และไลบรารี: ฉันขาดอะไรไป?ชุดข้อความในกลุ่ม Clojure Google ผู้เข้าร่วมหลายคนพูดถึงความจำเป็นที่จะต้องมีการอ้างอิงในพื้นที่ซึ่งไม่มีอยู่ในที่เก็บใด ๆ ในพื้นที่หรืออย่างอื่นและอธิบายรายละเอียดเกี่ยวกับโซลูชันที่พวกเขาคิดขึ้นมาสำหรับสถานการณ์ดังกล่าว บางทีคุณอาจจะเห็นว่ามีอะไรที่สามารถแก้ปัญหาของคุณได้ในตอนนี้ / อาจจะแก้ปัญหาได้ในอนาคตเมื่อฟีเจอร์นั้นครบกำหนด

อย่างไรก็ตามเป็นไปได้ว่า Leiningen อาจไม่มีเรื่องราวที่ดีพร้อมสำหรับสถานการณ์ที่ซับซ้อนบางอย่าง หากคุณรู้สึกว่านี่อาจเป็นความจริงในกรณีของคุณ (และฉันหมายถึงหลังจากที่คุณพิจารณาแนวคิด repo ส่วนตัวแล้ว) ต่อไปนี้เป็นลิงก์ไปยังทางเลือกที่ใช้ maven ซึ่งนำมาจากเธรดที่กล่าวถึงข้างต้น: polyglot maven , clojure-maven-plugin ;โพสต์บล็อกนี้มีจุดมุ่งหมายเพื่อเป็นประโยชน์กับผู้ที่พยายามใช้ maven กับ Clojure ดังที่ฉันจำได้ Meikel Brandmeyer (เช่นเดียวกับ SO ภายใต้การจัดการออนไลน์ของเขาของ kotarak) ใช้ Gradle (ระบบการสร้าง Groovy) กับปลั๊กอินเพื่อรองรับ Clojure ที่เรียกว่า Clojuresque ฉันไม่เคยลองด้วยตัวเองเพราะไม่รู้สิ่งแรกเกี่ยวกับ Groovy แต่เขาอ้างว่าเป็นผู้ดำเนินการสร้างที่ดีมากกับมันและฉันเชื่อว่ามันไม่มีอะไรเกี่ยวข้องกับ maven - สิ่งที่เป็นข้อดีในตัวมันเอง สำหรับพวกเราบางคน :-)


2
Re: "ไม่มีข้อตกลงสากลเกี่ยวกับคำถามที่ว่าเครื่องมือใดเป็นเครื่องมือสร้างที่ดีที่สุดสำหรับ Clojure" ... ณ วันนี้ดูเหมือนว่า Leiningen จะเป็นมาตรฐานที่หนีไม่พ้นในขณะนี้ ผลการสำรวจปี 2013: lein-survey-2013.herokuapp.com/results
David J.

8
ตั้งแต่ Leiningen v2 ฟังก์ชัน lib / directory ถูกลบออก ดู: github.com/technomancy/leiningen/wiki/…
Jared314

ณ วันนี้ Leiningen อาจยังคงเป็นที่นิยมมากที่สุด แต่ Boot ก็เป็นที่นิยมเช่นกัน
อังคาร

64

เพียงแค่ใช้ : resource-pathsในไฟล์ project.clj ของคุณ ฉันใช้มันเช่นเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ Siebel เพิ่งสร้างไดเร็กทอรีรีซอร์สในไดเร็กทอรีโปรเจ็กต์ของฉันและคัดลอกไฟล์ jar ไว้ในนั้น แต่แน่นอนคุณสามารถใช้ไดเร็กทอรีทั่วไปได้:

(defproject test-project "0.1.0-SNAPSHOT"
:description "Blah blah blah"
...
:resource-paths ["resources/Siebel.jar" "resources/SiebelJI_enu.jar"])

จากการจำลองleinฉันสามารถสร้างอินสแตนซ์ Siebel Data Bean ได้เช่น

(def sbl (com.siebel.data.SiebelDataBean.))
(.login sbl "siebelServer" "user" "password")
...

หากคุณมี Java เวอร์ชันใหม่กว่าคุณสามารถใช้สัญลักษณ์แทนในข้อกำหนดเส้นทางของคุณได้เช่นนี้สำหรับไดเร็กทอรีทั่วไป:

:resource-paths ["/tmp/SiebelJars/*"]

Lein 2 ไม่รองรับ globbing แต่ปลั๊กอินgithub.com/dchelimsky/lein-expand-resource-pathsพร้อมใช้งานหากคุณต้องการ
ไตร่ตรอง

2
นี่คือคำตอบที่ดีที่สุดที่ฉันเคยเห็นมา ดูเหมือนว่าการติดตั้ง mvn ในเครื่องจะไม่ทำงานสำหรับฉันอีกต่อไป
David Williams

7
สิ่งนี้ใช้ไม่ได้กับ uberjar เนื่องจาก uberjar จะเพิ่มไหการพึ่งพาใน jar แทนที่จะเพิ่มไฟล์คลาส dependencies
Tobias Domhan

50
  1. สร้างไดเร็กทอรีในโครงการ:

    mkdir maven_repository

  2. เพิ่มไหในพื้นที่ลงในที่เก็บนี้:

    ตัวอย่างเช่นคำสั่งนี้เพิ่มjaad-0.8.3.jarไฟล์ไปยังที่เก็บ maven:

    mvn deploy:deploy-file -Dfile=jaad-0.8.3.jar -DartifactId=jaad -Dversion=0.8.3 -DgroupId=jaad -Dpackaging=jar -Durl=file:maven_repository

  3. เพิ่มสิ่งต่อไปนี้ใน project.clj

    :repositories {"local" "file:maven_repository"}

  4. ตอนนี้lein depsควรทำงานปกติ:

    $ lein deps Downloading: jaad/jaad/0.8.3/jaad-0.8.3.pom from local Transferring 0K from local [WARNING] *** CHECKSUM FAILED - Error retrieving checksum file for jaad/jaad/0.8.3/jaad-0.8.3.pom - IGNORING

คำเตือนสามารถเพิกเฉยได้เนื่องจาก jar จะถูกตรวจสอบในโปรเจ็กต์และไม่ได้ดาวน์โหลดจากอินเทอร์เน็ต

แหล่งที่มาดั้งเดิม: การใช้ JAR ในเครื่องกับ Leiningen (เปลี่ยนตั้งแต่การคัดลอก)


ขั้นตอนดีที่ลิงค์นี้ สิ่งนี้เป็นประโยชน์กับฉันมาก
goger

2
ด้วยเวอร์ชันที่ใหม่กว่าคุณอาจต้องการใช้ mvn deploy: deploy-file แทน install: install-file และระบุ -Durl = file: repo แทน -DlocalRepositoryPath = repo ใน project.clj คุณสามารถใช้:: repositories {"local" "file: maven_repository"} ดู: gist.github.com/stuartsierra/3062743 (ฉันแก้ไขคำถามแล้ว แต่ยังต้องได้รับการอนุมัติ)
Tobias Domhan

33

ฉันพบว่าlein pom; lein jar; lein installทำงานได้ดีเมื่อพัฒนาไลบรารี

ทำสิ่งนี้ในไลบรารีที่กำลังพัฒนาและแอปพลิเคชันของคุณที่ต้องการจะใช้โดยไม่:repositoriesต้องใช้ foo ใด ๆ


อีกวิธีหนึ่งlein do pom, jar, installคือกระชับขึ้นเล็กน้อย


สิ่งนี้ทำให้สามารถเรียกไลบรารีได้เหมือนที่อื่น ๆ :dependencies [[project-name "version"]]


3
เมื่อเทียบกับโซลูชันอื่น ๆ มันง่ายมากและได้ผล! ไม่จำเป็นต้องติดตั้ง maven ขอบคุณ
dkinzer

คุณอ้างอิง jar ผลลัพธ์ในไฟล์โครงการ lein ได้อย่างไร
interstar

ชอบ ๆ ๆ ๆ:dependencies [[project-name "version"]]
roboli

1
ซึ่งใช้งานได้ดีบน Windows เช่นกัน ไม่จำเป็นต้องติดตั้ง maven ตามที่ได้กล่าวไปแล้ว ฉันได้ลองใช้ IntelliJ + Cursive บน Windows และทำงานได้อย่างสมบูรณ์ "lein pom; lein jar; lein install" ในบรรทัดคำสั่งของ Windows
endbegin

4
คุณต้องทำlein installเท่านั้น มันจะสร้างโถและปอมให้คุณ
neverfox

15

ฉันเชื่อว่าแนวทางที่ "ถูกต้อง" คือการสร้าง Maven Repository ส่วนตัวเพื่อให้คุณสามารถจัดเก็บขวดโหลไว้ในที่เดียวและสาขาทั้งหมดของคุณ ฯลฯ จะรับการเปลี่ยนแปลง นี่อาจจะมากเกินไปสำหรับสิ่งที่คุณทำ ฉันสงสัยว่านี่เป็นวิธีที่ง่ายกว่านี้ไหม


5
ขอบคุณฉันจะตรวจสอบให้ แม้ว่าฉันจะต้องบอกว่า maven ทำให้ความกลัวในใจของฉันสั่นคลอน หากคุณทราบตัวอย่างทีละขั้นตอนง่ายๆที่ต้องทำโปรดชี้ให้ฉันดู ทำไมงานสร้างถึงซับซ้อนมากในโลก Java?
signalseeker



3

วิธีแก้ปัญหาเหล่านี้ไม่ได้ผลกับฉัน ฉันได้ติดตั้งที่เก็บในเครื่องแทนและใช้ maven เพื่อติดตั้งไฟล์ jar ในที่เก็บในเครื่องและเพิ่ม repo ในเครื่องลงใน project.clj ของฉัน

ในบรรทัดคำสั่ง:

mvn deploy:deploy-file -DgroupId=local -DartifactId=bar \
    -Dversion=1.0.0 -Dpackaging=jar -Dfile=bar.jar \
    -Durl=file:repo

และฉันเขียน project.clj ของฉันดังนี้:

(defproject foo "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [local/bar "1.0.0"]]
  :repositories {"project" "file:repo"})

หวังว่าจะช่วยได้

[อ้างอิง: https://gist.github.com/stuartsierra/3062743 ]




0

ตัวเลือกที่ดีที่สุดคือการตั้งค่าโรงงานผลิต JFrog / Nexus ส่วนตัวและปรับใช้สแนปชอต / รีลีสของคุณที่นั่นจากนั้นเพิ่ม artifiactory เป็นที่เก็บใน project.clj ของคุณ

วิธีอื่น ๆ ที่ง่ายกว่าคือ

Static HTTPที่เก็บส่วนตัวที่ง่ายที่สุดคือเว็บเซิร์ฟเวอร์ที่ชี้ไปที่ไดเร็กทอรีที่เต็มไปด้วยไฟล์แบบคงที่ คุณสามารถใช้ไฟล์: /// URL ในที่เก็บ: ของคุณเพื่อปรับใช้ในลักษณะนั้นหากไดเร็กทอรีอยู่ภายในเครื่องที่ Leiningen กำลังทำงานอยู่

SCP หากคุณมีเซิร์ฟเวอร์ที่ตั้งค่าด้วยคีย์สาธารณะ SSH ของคุณอยู่แล้วการขนส่ง scp เป็นวิธีง่ายๆในการเผยแพร่และใช้การอ้างอิงส่วนตัว วางสิ่งต่อไปนี้ไว้ใน defproject:

:plugins [[org.apache.maven.wagon/wagon-ssh-external "2.6"]]
:repositories [["releases" "scp://somerepo.com/home/repo/"]]

จากนั้นวางสิ่งต่อไปนี้ไว้นอกโครงการเริ่มต้น:

(cemerick.pomegranate.aether/register-wagon-factory!
 "scp" #(let [c (resolve 'org.apache.maven.wagon.providers.ssh.external.ScpExternalWagon)]
          (clojure.lang.Reflector/invokeConstructor c (into-array []))))

นอกจากนี้ยังเป็นไปได้ที่จะปรับใช้กับที่เก็บโดยใช้การขนส่ง scp และใช้จากที่เก็บผ่าน http หากคุณตั้งค่า nginx หรือสิ่งที่คล้ายกันเพื่อให้บริการไดเร็กทอรีที่เก็บผ่าน HTTP

NB SCP ที่นำไปใช้กับ Clojars ไม่ได้รับการสนับสนุนอีกต่อไป

แหล่งที่มาดั้งเดิมอยู่ที่นี่https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.