Есть ли способ получить версию из пакета.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
801   14  

14 ответов:

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

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

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

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

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

process.env.npm_package_version

посмотреть пакета.json vars для более подробной информации.

С помощью модулей 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",
  ...
}

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

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

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

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

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


  1. ответ

    const version = process.env.npm_package_version


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

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

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

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

Я знаю, что этот вопрос нацелен на узел.js однако, если вы используете Webpack для связывания своего приложения просто напоминанием, рекомендуется использовать DefinePlugin чтобы объявить глобальную версию в конфигурации и ссылаться на нее. Так что вы могли бы сделать в вашей webpack.config.json

const pkg = require('../../package.json');

...

plugins : [
    new webpack.DefinePlugin({
      AppVersion: JSON.stringify(pkg.version),
...

а то AppVersion теперь глобальный, который доступен для использования. Также убедитесь в своем .eslintrc вы игнорируете это с помощью Globals prop

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

$ genversion lib/version.js

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

можно использовать 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' 

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.