Есть ли способ получить версию из package.json в коде nodejs? - PullRequest
490 голосов
/ 06 февраля 2012

Есть ли способ получить версию, установленную в 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

Ответы [ 18 ]

856 голосов
/ 01 июня 2012

Я обнаружил, что следующий фрагмент кода работает лучше всего для меня. Поскольку для загрузки package.json используется require, он работает независимо от текущего рабочего каталога.

var pjson = require('./package.json');
console.log(pjson.version);

Предупреждение, любезно предоставлено @Pathogen:

Выполнение этого с Browserify имеет последствия для безопасности.
Будьте осторожны, чтобы не подвергать ваш package.json клиенту, поскольку это означает, что все номера версий зависимостей, команды сборки и тестирования и многое другое отправляются клиенту.
Если вы строите сервер и клиент в одном проекте, вы также предоставляете номера версий на стороне сервера. Такие конкретные данные могут быть использованы злоумышленником для лучшего соответствия атаке на вашем сервере.

265 голосов
/ 12 марта 2014

Если ваше приложение запускается с 'npm start', вы можете просто использовать:

process.env.npm_package_version

См. package.json vars для более подробной информации.

116 голосов
/ 20 апреля 2016

Используя модули ES6, вы можете делать следующее:

import {version} from './package.json';
71 голосов
/ 10 ноября 2015

Или в простой старой оболочке:

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",
  ...
}
40 голосов
/ 12 февраля 2018

Правильные ответы будут здесь, например:

  1. Ответ (этот код включает package.json файл и получить версию)

    const { version } = require('./package.json');


Ответ

const version = process.env.npm_package_version


Пожалуйста, не используйте JSON.parse, fs.readFile, fs.readFileSync и не делайтеНе используйте npm modules, для этого вопроса нет необходимости.

35 голосов
/ 21 мая 2012

Вот как читать версию из package.json:

fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
21 голосов
/ 05 марта 2014

Существует еще один способ извлечения определенной информации из файла 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.

Надеюсь, это поможет.

16 голосов
/ 05 октября 2017

Для тех, кто ищет безопасное клиентское решение, которое также работает на серверной стороне, есть genversion . Это инструмент командной строки, который считывает версию из ближайшего package.json и генерирует импортируемый файл модуля CommonJS, который экспортирует версию. Отказ от ответственности: я сопровождающий.

$ genversion lib/version.js

Я признаю, что безопасность на стороне клиента не была основной целью OP, но, как обсуждалось в ответах Mark Wallace и aug , это очень важно, а также причина, по которой я нашел это Q & A.

8 голосов
/ 18 сентября 2017

Просто добавляю ответ, потому что я пришел к этому вопросу, чтобы увидеть лучший способ включить версию из 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 вы игнорируете это через глобальную опору

3 голосов
/ 02 августа 2017

Вы можете использовать пакет 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 по какой-то причине отсутствует.

...