Есть ли способ получить версию из 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
Правильные ответы будут здесь в примере:
-
Ответ (этот код включает файл package.json
и получает версию)
const { version } = require('./package.json');
-
Ответ
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
Чтобы определить версию пакета в коде узла, вы можете использовать следующее:
-
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-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