มีวิธีรับเวอร์ชันที่ติดตั้งในpackage.json
แอพ nodejs หรือไม่? ฉันต้องการสิ่งนี้
var port = process.env.PORT || 3000
app.listen port
console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, app.VERSION
มีวิธีรับเวอร์ชันที่ติดตั้งในpackage.json
แอพ nodejs หรือไม่? ฉันต้องการสิ่งนี้
var port = process.env.PORT || 3000
app.listen port
console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, app.VERSION
คำตอบ:
ฉันพบว่าส่วนรหัสต่อไปนี้ทำงานได้ดีที่สุดสำหรับฉัน เนื่องจากมันใช้require
ในการโหลดpackage.json
มันทำงานโดยไม่คำนึงถึงไดเรกทอรีการทำงานปัจจุบัน
var pjson = require('./package.json');
console.log(pjson.version);
คำเตือนความอนุเคราะห์จาก @Pathogen:
การทำสิ่งนี้กับ Browserify มีผลกระทบด้านความปลอดภัย
ระวังอย่าให้package.json
ลูกค้าของคุณเปิดเผยเพราะหมายถึงว่าหมายเลขเวอร์ชันการพึ่งพาทั้งหมดคำสั่ง build และทดสอบและอื่น ๆ ของคุณจะถูกส่งไปยังไคลเอนต์
หากคุณกำลังสร้างเซิร์ฟเวอร์และไคลเอนต์ในโครงการเดียวกันคุณจะเปิดเผยหมายเลขเวอร์ชั่นฝั่งเซิร์ฟเวอร์ด้วย ผู้โจมตีสามารถใช้ข้อมูลเฉพาะดังกล่าวเพื่อให้เหมาะกับการโจมตีบนเซิร์ฟเวอร์ของคุณ
require('root-require')('package.json').version
Error: Cannot find module 'package.json'
.
หากแอปพลิเคชันของคุณเปิดใช้งานด้วย 'เริ่มต้น npm' คุณสามารถใช้:
process.env.npm_package_version
ดูpackage.json varsสำหรับรายละเอียดเพิ่มเติม
npm run …
) $npm_package_version
เวอร์ชั่นจะอยู่ในตัวแปรสภาพแวดล้อม
npm start
แต่ไม่ได้อยู่ในแอพพลิเคอิเล็กตรอนที่สร้าง: app.getVersion
การที่คุณสามารถหาได้ใน
การใช้โมดูล ES6 คุณสามารถทำสิ่งต่อไปนี้:
import {version} from './package.json';
หรือในเปลือกเก่าธรรมดา:
node -e "console.log(require('./package.json').version);"
สิ่งนี้สามารถย่อให้เล็กลงได้
node -p "require('./package.json').version"
แม้ว่านี่จะไม่ใช่คำถามที่ถามมา แต่ก็มีประโยชน์หากคุณต้องการใช้เวอร์ชันภายในpackage.json
ตัวเองเช่นเพื่อเข้าสู่ไฟล์ที่มีเวอร์ชันในscript
:
{
"name": "myapp",
"version": "0.1.2",
"scripts": {
"run": "node index.js 2>&1 | tee -a myapp_v$(node -p \"require('./package.json').version\").log",
...
}
มีสองวิธีในการดึงข้อมูลเวอร์ชัน:
package.json
และรับรุ่น:const { version } = require('./package.json');
const version = process.env.npm_package_version;
กรุณาอย่าใช้JSON.parse
, fs.readFile
, fs.readFileSync
และไม่ได้ใช้อีกnpm modules
ก็ไม่จำเป็นสำหรับคำถามนี้
npm_*
ค่าสภาพแวดล้อมที่มีอยู่เฉพาะในกรณีที่สคริปต์ของคุณเริ่มต้นจาก NPM npm start
เช่น หากคุณกำลังทำnode app.js
หรือคล้ายกันพวกเขาจะไม่ปรากฏ
package.json
?
นี่คือวิธีอ่านเวอร์ชันจาก package.json:
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
require() introduces? (for instance, does
ต้องใช้ () `ไม่สนับสนุนการอ่าน utf8? ตามที่ตัวอย่างของคุณอาจแนะนำ)
require()
แคชไฟล์ซึ่งในกรณีนี้ไม่ควรสร้างความแตกต่าง
JSON.parse(fs.readFileSync('package.json', 'utf8'))
แทนdelete require.cache[require.resolve('package.json')]; require('package.json')
เมื่อพวกเขาต้องการที่จะโหลด?
มีวิธีการดึงข้อมูลบางอย่างจากpackage.json
ไฟล์ของคุณคือการใช้โมดูลpkginfo
การใช้งานโมดูลนี้ง่ายมาก คุณสามารถรับตัวแปรแพ็กเกจทั้งหมดโดยใช้:
require('pkginfo')(module);
หรือเฉพาะรายละเอียดบางอย่าง ( version
ในกรณีนี้)
require('pkginfo')(module, 'version');
และตัวแปรแพ็กเกจของคุณจะถูกตั้งค่าเป็นmodule.exports
(ดังนั้นหมายเลขเวอร์ชันจะสามารถเข้าถึงได้ผ่านmodule.exports.version
)
คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้:
require('pkginfo')(module, 'version');
console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, module.exports.version
โมดูลนี้จะมีคุณลักษณะที่ดีมาก - มันสามารถนำมาใช้ในไฟล์ใด ๆ ในโครงการของคุณ (เช่นในโฟลเดอร์ย่อย) package.json
โดยอัตโนมัติและจะดึงข้อมูลจากคุณ ดังนั้นคุณไม่ต้องกังวลว่าจะอยู่ที่ไหนpackage.json
จะอยู่ที่ไหน
ฉันหวังว่าจะช่วย
module
นี่คืออะไร
module
ไม่ใช่ตัวแปรตัวอย่างนี้โดยเฉพาะ มันเป็นตัวแปรที่แสดงถึงโมดูลปัจจุบันใน node.js คุณสามารถอ่านเพิ่มเติมเกี่ยวกับโมดูล node.js ได้ที่นี่: nodejs.org/api/modules.html#modules_the_module_object
สำหรับผู้ที่มองหาที่ปลอดภัยฝั่งไคลเอ็นต์การแก้ปัญหาที่ยังทำงานบนฝั่งเซิร์ฟเวอร์มีgenversion เป็นเครื่องมือบรรทัดคำสั่งที่อ่านเวอร์ชันจาก package.json ที่ใกล้ที่สุดและสร้างไฟล์โมดูล CommonJS ที่สามารถอิมพอร์ตได้ซึ่งส่งออกเวอร์ชัน ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้ดูแล
$ genversion lib/version.js
ฉันรับทราบความปลอดภัยของลูกค้าไม่ใช่ความตั้งใจหลักของ OP แต่ตามที่กล่าวไว้ในคำตอบโดยMark Wallaceและaugมันมีความเกี่ยวข้องสูงและเป็นเหตุผลที่ฉันพบคำถามและคำตอบนี้
เพียงเพิ่มคำตอบเพราะฉันมาที่คำถามนี้เพื่อดูวิธีที่ดีที่สุดในการรวมเวอร์ชันจาก package.json ในเว็บแอปพลิเคชันของฉัน
ฉันรู้ว่าคำถามนี้ถูกตั้งเป้าหมายไว้สำหรับ Node.js แต่ถ้าคุณใช้ Webpack เพื่อรวมแอปของคุณเพียงแค่เตือนความจำวิธีที่แนะนำคือการใช้ DefinePluginเพื่อประกาศเวอร์ชันทั่วโลกในการกำหนดค่าและการอ้างอิงว่า ดังนั้นคุณสามารถทำในของคุณwebpack.config.json
const pkg = require('../../package.json');
...
plugins : [
new webpack.DefinePlugin({
AppVersion: JSON.stringify(pkg.version),
...
และAppVersion
ตอนนี้ก็คือโกลบอลที่คุณสามารถใช้ได้ ตรวจสอบให้แน่ใจในตัวคุณ.eslintrc
ว่าคุณไม่สนใจสิ่งนี้ผ่านทางเสากลม
ตัวเลือกที่ 1
แนวปฏิบัติที่เหมาะสมที่สุดคือเวอร์ชันจาก package.json โดยใช้ตัวแปรสภาวะแวดล้อม npm
process.env.npm_package_version
ข้อมูลเพิ่มเติมเกี่ยวกับ: https://docs.npmjs.com/using-npm/config.html
สิ่งนี้จะทำงานเมื่อคุณเริ่มบริการของคุณโดยใช้คำสั่ง NPM
ข้อมูลด่วน: คุณสามารถอ่านค่าใด ๆ ใน pacakge.json โดยใช้ process.env.npm_package_ [keyname]
ตัวเลือก 2
การตั้งค่าเวอร์ชันในตัวแปรสภาพแวดล้อมโดยใช้https://www.npmjs.com/package/dotenvเป็น.env
ไฟล์และเกี่ยวข้องกับมันprocess.env.version
คุณสามารถใช้ ES6 เพื่อนำเข้า package.json เพื่อดึงหมายเลขเวอร์ชันและส่งออกเวอร์ชันบนคอนโซล
import {name as app_name, version as app_version} from './path/to/package.json';
console.log(`App ---- ${app_name}\nVersion ---- ${app_version}`);
หากต้องการพิจารณาเวอร์ชันแพ็กเกจในโค้ดโหนดคุณสามารถใช้สิ่งต่อไปนี้:
const version = require('./package.json').version;
สำหรับ <ES6 เวอร์ชั่น
import {version} from './package.json';
สำหรับรุ่น ES6
const version = process.env.npm_package_version;
หากแอปพลิเคชันเริ่มต้นใช้npm start
งานตัวแปรสภาพแวดล้อม npm_ * ทั้งหมดจะพร้อมใช้งาน
คุณสามารถใช้แพ็กเกจ npm ต่อไปนี้ได้เช่นกัน - root-need, pkginfo, project-version
คุณสามารถใช้แพ็คเกจรุ่นโครงการได้
$ npm install --save project-version
แล้วก็
const version = require('project-version');
console.log(version);
//=> '1.0.0'
มันใช้process.env.npm_package_version
แต่ทางเลือกในรุ่นที่เขียนpackage.json
ในกรณีที่ env var หายไปด้วยเหตุผลบางอย่าง
ฉันทำสิ่งนี้กับfindup-sync
:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
package.json
คล้ายกับprocess.env.npm_package_version
นอกเหนือจากที่ไม่ต้องการให้เริ่มต้นผ่านทาง npm ดังนั้นการลองเอารุ่นไลบรารี่ของคุณจะได้เวอร์ชั่นของผู้โทร ความต้องการอย่างง่าย ('./ package.json') จะหลีกเลี่ยงปัญหานี้
ฉันรู้ว่านี่ไม่ใช่เจตนาของ OP แต่ฉันต้องทำเช่นนี้ดังนั้นหวังว่าจะช่วยคนต่อไป
หากคุณใช้นักเทียบท่าสำหรับกระบวนการ CI / CD ของคุณคุณจะได้รับสิ่งนี้!
version:
image: node:7-alpine
volumes:
- .:/usr/src/service/
working_dir: /usr/src/service/
command: ash -c "node -p \"require('./package.json').version.replace('\n', '')\""
สำหรับอิมเมจคุณสามารถใช้อิมเมจโหนดใดก็ได้ ฉันใช้อัลไพน์เพราะมันเล็กที่สุด
ทำไมไม่ใช้การแก้ไขที่ต้องการ ...
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
ด้วยวิธีการนี้จะทำงานสำหรับเส้นทางย่อยทั้งหมด :)
อิมพอร์ตpackage.json
ไฟล์ของคุณไปยังserver.js
หรือapp.js
จากนั้นเข้าถึงคุณสมบัติ package.json ไปยังไฟล์เซิร์ฟเวอร์
var package = require('./package.json');
ตัวแปรแพคเกจประกอบด้วยข้อมูลทั้งหมดใน package.json
ฉันสร้างโค้ดที่มีประโยชน์เพื่อรับ package.json ของโมดูลพาเรนต์
function loadParentPackageJson() {
if (!module.parent || !module.parent.filename) return null
let dir = path.dirname(module.parent.filename)
let maxDepth = 5
let packageJson = null
while (maxDepth > 0) {
const packageJsonPath = `${dir}/package.json`
const exists = existsSync(packageJsonPath)
if (exists) {
packageJson = require(packageJsonPath)
break
}
dir = path.resolve(dir, '../')
maxDepth--
}
return packageJson
}
หากใช้การยกเลิกrollup-plugin-replace
ปลั๊กอินสามารถใช้เพื่อเพิ่มเวอร์ชันโดยไม่ต้องเปิดเผย package.json ให้กับไคลเอ็นต์
// rollup.config.js
import pkg from './package.json';
import { terser } from "rollup-plugin-terser";
import resolve from 'rollup-plugin-node-resolve';
import commonJS from 'rollup-plugin-commonjs'
import replace from 'rollup-plugin-replace';
export default {
plugins: [
replace({
exclude: 'node_modules/**',
'MY_PACKAGE_JSON_VERSION': pkg.version, // will replace 'MY_PACKAGE_JSON_VERSION' with package.json version throughout source code
}),
]
};
จากนั้นในซอร์สโค้ดที่ใดก็ตามที่คุณต้องการมีเวอร์ชัน package.json คุณจะต้องใช้สตริง 'MY_PACKAGE_JSON_VERSION'
// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js
console.log(process.version)