โปรแกรมหรือไลบรารี Haskell ของฉันจะค้นหาหมายเลขเวอร์ชันได้อย่างไร

ฉันต้องการให้โปรแกรมที่เชื่อมต่อแล้วของฉันมีสวิตช์ --version

ฉันต้องการให้รายงานเวอร์ชันเดียวกันกับที่มีอยู่ในไฟล์ .cabal

หากฉันต้องอัปเดตหมายเลขเวอร์ชันแยกกันในซอร์สโค้ด Haskell ของฉันและในไฟล์ .cabal ในที่สุดฉันก็จะทำให้ข้อมูลเหล่านั้นไม่ซิงค์กัน

แล้วโปรแกรมของฉันในขณะที่คอมไพล์ภายใต้ cabal จะรับหมายเลขเวอร์ชันจากไฟล์ .cabal ได้อย่างไร


person dave4420    schedule 23.05.2010    source แหล่งที่มา


คำตอบ (1)


สิ่งนี้ได้รับการสนับสนุนอย่างดีจาก Cabal ดังต่อไปนี้ (จาก xmonad):

นำเข้า Paths_$myprogram - ไฟล์ที่ Cabal สร้างขึ้นโดยมีข้อมูลเมตาจำนวนมากจากไฟล์ .cabal พร้อมด้วยโมดูลสำหรับจัดการหมายเลขเวอร์ชัน:

import Paths_xmonad (version)
import Data.Version (showVersion)

เพิ่มคำสั่งการพิมพ์เพื่อพิมพ์ฟิลด์ 'เวอร์ชัน' ที่จัดทำโดย Paths_$myprogram:

case args of
     ["--version"] -> putStrLn ("xmonad " ++ showVersion version)

โดยทั่วไป ไฟล์ Paths ที่สร้างโดย Cabal จะมีค่าต่อไปนี้ใน dist/build/autogen/

version,
getBinDir, getLibDir, getDataDir, getLibexecDir,
getDataFileName
person Don Stewart    schedule 23.05.2010
comment
5 ปีหลังจากคำตอบนี้ เป็นที่น่าสังเกตว่าวิธีนี้ใช้ได้ผลดีภายใต้เครื่องมือสร้าง Stack ใหม่ ข้อแตกต่างเพียงอย่างเดียวคือไฟล์ Paths อยู่ในตำแหน่งเช่น .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/autogen/ (ส่วน x86_64-osx จะเปลี่ยนไปตามสถาปัตยกรรมของคุณ) - person Luis Casillas; 01.01.2016
comment
อย่าลืมใส่ Paths_$myprogram ลงในโมดูลอื่นๆ ใน .cabal ของคุณ เพื่อหลีกเลี่ยงไม่ให้ ld ส่งคืนสถานะการออก 1 ครั้ง - person Sophie; 27.09.2016
comment
การอ่านความคิดเห็นของ @LuisCasillas ด้านบนดูเหมือนว่าจะทำให้งานนี้จำเป็นต้องมีโมดูลที่เชื่อมโยงแบบคงที่ในเส้นทางการนำเข้า แต่นั่นหมายความว่าเส้นทางนี้จำเป็นต้องเปลี่ยนตามตำแหน่งที่สร้างโปรแกรมใช่ไหม หากเป็นเช่นนั้น ก็แทบจะเป็นไปไม่ได้เลยในกรณีที่โปรแกรมของคุณสร้างขึ้นจากสถาปัตยกรรมหลายๆ แบบหรือสร้างขึ้นจากระยะไกล - person Ashesh; 09.12.2018
comment
โปรดทราบว่า -s ใดๆ ในชื่อแพ็คเกจของคุณจะต้องแทนที่ด้วย _ ใน Paths_$myprogram - person orome; 09.12.2018