Есть ли способ получить версию из package.json в коде nodejs?

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

Ответ 1

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

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

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

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

Ответ 2

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

process.env.npm_package_version

Подробнее см. package.json vars.

Ответ 3

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

import {version} from './package.json';

Ответ 4

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

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",
  ...
}

Ответ 5

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

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

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


  1. Ответ

    const version = process.env.npm_package_version


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

Ответ 6

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

fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version

Ответ 7

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

Я надеюсь, что это поможет.

Ответ 8

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

$ genversion lib/version.js

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

Ответ 9

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

Ответ 10

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

Ответ 11

Вы можете использовать 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}');

Ответ 12

Чтобы определить версию пакета в коде узла, вы можете использовать следующее:

  1. const version = require('./package.json').version; для <ES6 версий

  2. import {version} from './package.json'; для версии ES6

  3. const version = process.env.npm_package_version; если приложение было запущено с использованием npm start, все переменные окружения npm_ * становятся доступными.

  4. Вы также можете использовать следующие пакеты npm - root-require, pkginfo, project-version.

Ответ 13

Я не думаю, что какой-либо способ встроен в node сам, но нет ничего, что мешает вам просто прочитать файл и самостоятельно разобрать JSON с помощью модуля fs.

Обновление:

Вышеупомянутое верно для старых версий node. Как утверждает принятый ответ, в текущих версиях node вы можете просто require создать файл JSON. Просто имейте в виду, что будет читаться синхронно и, следовательно, не следует использовать динамически.

Ответ 14

Я делаю это с помощью findup-sync:

var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1' 

Ответ 15

Я знаю, что это не цель OP, но я просто должен был это сделать, поэтому надеюсь, что это поможет следующему человеку.

Если вы используете компоновку docker для процесса 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', '')\""

для изображения, вы можете использовать любое изображение node. Я использую альпийский язык, потому что он наименьший.

Ответ 16

Импортируйте файл package.json в server.js или app.js а затем получите доступ к свойствам package.json в файл сервера.

var package = require('./package.json');

переменная пакета содержит все данные в package.json.

Ответ 17

Я сделал полезный код, чтобы получить родительский модуль 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
}

Ответ 18

Почему бы не использовать требуемое разрешение...

const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)

При таком подходе работаю для всех подпутей :)

Ответ 19

почему бы не использовать родной путь? другие методы не удались для меня.

// Load native UI library
var gui = require('nw.gui');

// Get the name field in manifest
gui.App.manifest.version