有没有办法在nodejs app中的package.json
中设置版本?我想要这样的东西
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
答案 0 :(得分:839)
我发现以下代码片段最适合我。由于它使用require
加载package.json
,因此无论当前工作目录如何,它都能正常工作。
var pjson = require('./package.json');
console.log(pjson.version);
警告,由@Pathogen提供:
使用Browserify执行此操作具有安全隐患 注意不要将
package.json
暴露给客户端,因为这意味着所有依赖版本号,构建和测试命令等都会发送到客户端。
如果您在同一项目中构建服务器和客户端,则也会公开服务器端版本号。 攻击者可以使用此类特定数据来更好地适应您服务器上的攻击。</ p>
答案 1 :(得分:257)
答案 2 :(得分:112)
使用ES6模块,您可以执行以下操作:
import {version} from './package.json';
答案 3 :(得分:68)
或者在普通的旧壳中:
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",
...
}
答案 4 :(得分:39)
回答(此代码包含package.json
文件并获取版本)
const { version } = require('./package.json');
答案
const version = process.env.npm_package_version
请不要使用JSON.parse
,fs.readFile
,fs.readFileSync
并且不要使用其他npm modules
这个问题不是必需的
答案 5 :(得分:34)
以下是如何阅读package.json的版本:
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
答案 6 :(得分:21)
还有另一种从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
的位置。
我希望这会有所帮助。
答案 7 :(得分:18)
选项1
最佳做法是使用npm环境变量从package.json进行版本控制。
process.env.npm_package_version
有关以下信息的更多信息:https://docs.npmjs.com/using-npm/config.html
这仅在您使用NPM命令启动服务时有效。
快速信息:您可以使用process.env.npm_package_ [keyname]
读取pacakge.json中的任何值
选项2
使用https://www.npmjs.com/package/dotenv作为.env
文件在环境变量中设置版本,并将其读取为process.env.version
答案 8 :(得分:13)
对于那些寻找也适用于服务器端的安全客户端解决方案的用户,有genversion。它是一个命令行工具,它从最近的package.json读取版本,并生成一个可导入的CommonJS模块文件,用于导出该版本。免责声明:我是维护者。
$ genversion lib/version.js
我承认客户端安全不是OP的主要目的,但正如Mark Wallace和aug的答案中所讨论的那样,它是高度相关的,也是我发现此Q&amp; A的原因。< / p>
答案 9 :(得分:9)
NPM 一个班轮:
npm -s run env echo '$npm_package_version'
答案 10 :(得分:7)
只是添加一个答案,因为我来到这个问题,看看在我的Web应用程序中包含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
you ignore this via the globals prop
答案 11 :(得分:3)
如果您想获取目标包的版本。
import { version } from 'TARGET_PACKAGE/package.json';
示例:
import { version } from 'react/package.json';
答案 12 :(得分:3)
您可以使用project-version包。
$ npm install --save project-version
然后
const version = require('project-version');
console.log(version);
//=> '1.0.0'
它使用process.env.npm_package_version
,但如果由于某种原因缺少env var,则会回退package.json
中编写的版本。
答案 13 :(得分:2)
如果您正在寻找 module (package.json: "type": "module")
(ES6 导入)支持,例如来自重构 commonJS,您应该(在撰写本文时)执行以下任一操作:
import { readFile } from 'fs/promises';
const pkg = JSON.parse(await readFile(new URL('./package.json', import.meta.url)));
console.log(pkg.version)
或者,使用 node --experimental-json-modules index.js
运行节点进程来做:
import pkg from './package.json'
console.log(pkg.version)
然而,您会收到警告,直到 json 模块普遍可用。
如果您收到语法或(顶级)异步错误,则您可能使用的是较旧的节点版本。至少更新到 node@14。
答案 14 :(得分:2)
我找到的最精简的方法:
const { version } = JSON.parse(fs.readFileSync('./package.json'))
答案 15 :(得分:2)
您可以使用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}`);
答案 16 :(得分:1)
一个安全的选择是添加一个 npm 脚本来生成一个单独的版本文件:
"scripts": {
"build": "yarn version:output && blitz build",
"version:output": "echo 'export const Version = { version: \"'$npm_package_version.$(date +%s)'\" }' > version.js"
}
这会输出带有内容的 version.js
:
export const Version = { version: "1.0.1.1622225484" }
答案 17 :(得分:1)
要确定节点代码中的软件包版本,可以使用以下命令:
const version = require('./package.json').version;
(用于
import {version} from './package.json';
(用于ES6版本)
const version = process.env.npm_package_version;
如果已经使用npm start
启动了应用程序,则所有npm_ *环境变量都将可用。
您也可以使用以下npm软件包-root-require,pkginfo,project-version。
答案 18 :(得分:1)
我知道这不是OP的意图,但我必须这样做,所以希望它可以帮助下一个人。
如果你正在使用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', '')\""
对于图像,您可以使用任何节点图像。我使用阿尔卑斯山,因为它是最小的。
答案 19 :(得分:1)
我使用findup-sync
执行此操作:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
答案 20 :(得分:0)
为什么不使用require resolve ...
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
使用这种方法可以处理所有子路径:)
答案 21 :(得分:0)
如果使用汇总,则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
答案 22 :(得分:0)
我做了一个有用的代码来获取父模块的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
}
答案 23 :(得分:0)
const { version } = require("./package.json");
console.log(version);
const v = require("./package.json").version;
console.log(v);
答案 24 :(得分:0)
我正在使用gitlab ci,并希望自动使用不同版本来标记我的docker映像并将其推送。现在他们的默认Docker映像不包含节点,所以我仅在shell中执行此操作的版本是
scripts / getCurrentVersion.sh
BASEDIR=$(dirname $0)
cat $BASEDIR/../package.json | grep '"version"' | head -n 1 | awk '{print $2}' | sed 's/"//g; s/,//g'
现在这是
请不要让我的脚本位于我的存储库中具有相应名称的子文件夹中。因此,如果您不将$ BASEDIR /../ package.json更改为$ BASEDIR / package.json
或者如果您希望能够获得主要版本,次要版本和补丁版本,请使用
scripts / getCurrentVersion.sh
VERSION_TYPE=$1
BASEDIR=$(dirname $0)
VERSION=$(cat $BASEDIR/../package.json | grep '"version"' | head -n 1 | awk '{print $2}' | sed 's/"//g; s/,//g')
if [ $VERSION_TYPE = "major" ]; then
echo $(echo $VERSION | awk -F "." '{print $1}' )
elif [ $VERSION_TYPE = "minor" ]; then
echo $(echo $VERSION | awk -F "." '{print $1"."$2}' )
else
echo $VERSION
fi
如果您的版本是1.2.3,请使用这种方式。您的输出看起来像这样
$ > sh ./getCurrentVersion.sh major
1
$> sh ./getCurrentVersion.sh minor
1.2
$> sh ./getCurrentVersion.sh
1.2.3
现在唯一需要确定的是,您的软件包版本将是package.json中的第一次使用该密钥,否则您将得到错误的版本
答案 25 :(得分:0)
将您的package.json
文件导入到server.js
或app.js
中,然后将package.json属性访问到服务器文件中。
var package = require('./package.json');
package变量包含package.json中的所有数据。
答案 26 :(得分:-1)
用于像这样对 web 组件进行版本控制:
const { version } = require('../package.json')
class Widget extends HTMLElement {
constructor() {
super()
this.attachShadow({ mode: 'open' })
}
public connectedCallback(): void {
this.renderWidget()
}
public renderWidget = (): void => {
this.shadowRoot?.appendChild(this.setPageTemplate())
this.setAttribute('version', version)
}
}
答案 27 :(得分:-9)
为什么不使用原生方式? 其他方法对我来说都失败了。
// Load native UI library
var gui = require('nw.gui');
// Get the name field in manifest
gui.App.manifest.version