Javascript: รับข้อมูล package.json ใน gulpfile.js


101

ไม่ใช่คำถามเฉพาะอึก ๆ แต่เราจะรับข้อมูลจากไฟล์ package.json ภายใน gulpfile.js ได้อย่างไร ตัวอย่างเช่นฉันต้องการรับโฮมเพจหรือชื่อและใช้ในงาน

คำตอบ:


116

อย่าใช้require('./package.json')สำหรับกระบวนการดู การใช้requireจะแก้ไขโมดูลตามผลลัพธ์ของคำขอแรก ดังนั้นหากคุณกำลังแก้ไข package.json ของคุณการแก้ไขเหล่านั้นจะไม่ทำงานจนกว่าคุณจะหยุดกระบวนการดูและเริ่มต้นใหม่ สำหรับขั้นตอนการเฝ้าดูอึกควรใช้วิธีการของ bitlinguist เนื่องจากจะอ่านไฟล์ซ้ำและแยกวิเคราะห์ทุกครั้งที่งานของคุณถูกดำเนินการ

var fs = require('fs');

var json = JSON.parse(fs.readFileSync('./package.json'));

4
ตกลงว่า "ต้อง" แคชผลลัพธ์ (ทำให้ไม่เหมาะสมหากคุณตั้งใจจะอ่าน / แก้ไข / อ่านอีกครั้ง) นั่นไม่ได้ทำให้เป็นทางออกที่แย่ในทุกกรณี OP กล่าวอย่างชัดเจนว่าเขาต้องการอ่านข้อมูลจากมัน
Mangled Deutz

2
เป็นไปได้ที่จะใช้requireและลบแคชด้วยdelete require.cache[require.resolve(FILEPATH)];
curly_brackets

@KennethB ทำไมไม่แยกเป็นคำตอบ? จะเพิ่มคะแนนโหวตมากขึ้นพอสมควร
kaiser

138

นี่ไม่เฉพาะอึก

var p = require('./package.json')
p.homepage

อัพเดท:

โปรดทราบว่า "ต้องใช้" จะแคชผลการอ่านซึ่งหมายความว่าคุณไม่สามารถกำหนดได้เขียนลงไฟล์จากนั้นต้องการอีกครั้งและคาดว่าผลลัพธ์จะได้รับการอัปเดต


7
ฉันรู้สึกเหมือนเป็นคนงี่เง่าที่ค้นหาสิ่งนี้เมื่อเห็นคำตอบของคุณ แน่นอน!
spikeheap

1
ทำงานให้ฉัน: P. และ +1 สำหรับความคิดเห็นเกี่ยวกับการแคชฉันเปลี่ยนมาใช้ 'fs.readFileSync ()' ในภายหลังตามที่ระบุไว้ด้านล่าง
บาร์ต

@spikeheap ฉันไม่รู้ว่าฉันเคยหัวเราะออกมาดัง ๆ ก่อนที่จะอ่านความคิดเห็นใน StackOverflow หรือไม่ แต่ฉันอยู่ที่นั่นกับคุณ! ขอบคุณสำหรับเสียงเชียร์ ฮ่า ๆ .
bit-less

6

นี่เป็นทางออกที่ดี @Mangled Deutz ตัวฉันเองเคยทำอย่างนั้นครั้งแรก แต่มันไม่ได้ผล (ย้อนกลับไปในวินาทีนั้น) จากนั้นฉันลองวิธีแก้ปัญหานี้:

# Gulpfile.coffee
requireJSON = (file) ->
    fs = require "fs"
    JSON.parse fs.readFileSync file

ตอนนี้คุณควรเห็นว่านี่เป็นเพียงเล็กน้อย (แม้ว่าจะใช้งานได้) require('./package.json')เป็นทางออกที่ดีที่สุด:

เคล็ดลับ

- อย่าลืมเพิ่ม "./" ไว้ด้านหน้าชื่อไฟล์ ฉันรู้ว่ามันง่าย แต่มันเป็นความแตกต่างระหว่างวิธีการที่ต้องการใช้งานได้และไม่ได้ผล


ขอบคุณ! สิ่งนี้ช่วยได้มาก
Adam Grant

1
ขอบคุณสำหรับการโหวตในที่สุดก็มีความคิดเห็น :) ดีใจที่ช่วยคุณได้
dewwwald

0

หากคุณกำลังทริกเกอร์อึกจาก NPM เช่นใช้ " npm run build " หรืออะไรสักอย่าง

(ใช้ได้เฉพาะกับทริกเกอร์การรันอึกโดย NPM)

process.env.npm_package_ วัตถุ

สิ่งนี้ควรถูกคั่นด้วยขีดล่างสำหรับวัตถุที่อยู่ลึกกว่า

หากคุณต้องการอ่าน config เฉพาะบางอย่างใน package.json เช่นคุณต้องการอ่าน config object ที่คุณสร้างใน package.json

scripts : {
   build: gulp 
},
config : {
   isClient: false.
}

จากนั้นคุณสามารถใช้

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