Node.js 有没有办法从nodejs代码中的package.json获取版本?
有没有办法在nodejs应用程序中获取Node.js 有没有办法从nodejs代码中的package.json获取版本?,node.js,npm,version,versioning,Node.js,Npm,Version,Versioning,有没有办法在nodejs应用程序中获取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 下面是如何读取package.json的版本: fs = requir
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
下面是如何读取package.json的版本:
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
编辑:哇,这个答案原来是2012年的!现在有几个更好的答案。最干净的可能是:
const { version } = require('./package.json');
我发现下面的代码片段最适合我。由于它使用
require
加载package.json
,因此无论当前工作目录如何,它都可以工作
var pjson=require('./package.json');
log(pjson.version);
警告,由以下人员提供:
import { version } from 'react/package.json';
使用Browserify执行此操作会带来安全隐患。小心不要向客户机公开您的
包.json
,因为这意味着所有依赖项版本号、构建和测试命令等都会发送到客户机。如果在同一个项目中构建服务器和客户端,那么也会公开服务器端版本号。 攻击者可以使用这些特定数据来更好地适应服务器上的攻击
还有另一种从
package.json
文件中获取特定信息的方法,即使用模块
这个模块的使用非常简单。您可以使用以下方法获取所有包变量:
require('pkginfo')(module);
或者仅限于某些详细信息(本例中为版本)
您的包变量将设置为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
此模块具有非常好的功能-它可以用于项目中的任何文件(例如,在子文件夹中),它将自动从您的
包.json
获取信息。因此,您不必担心package.json在哪里
我希望这会有所帮助。如果您的应用程序是使用npm start启动的,您只需使用:
process.env.npm_package_version
有关更多详细信息,请参阅。我通过以下方式完成此操作:
或者在普通的旧外壳中:
$ node -e "console.log(require('./package.json').version);"
这可以缩短为
$ node -p "require('./package.json').version"
使用ES6模块,您可以执行以下操作:
import {version} from './package.json';
我知道这不是OP的目的,但我必须这么做,所以希望它能帮助下一个人
如果您在CI/CD进程中使用docker compose,您可以通过这种方式获得它
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', '')\""
对于图像,可以使用任何节点图像。我使用阿尔卑斯山,因为它是最小的。你可以使用这个软件包
然后
它使用process.env.npm\u package\u version
,但如果出于某种原因缺少env var,则可以使用package.json
中编写的版本。只是添加了一个答案,因为我来问这个问题是为了找到将package.json中的版本包含在web应用程序中的最佳方法
我知道这个问题是针对Node.js的,但是,如果您使用Webpack捆绑应用程序,建议您使用在配置中声明全局版本并引用该版本。因此,您可以在webpack.config.json
const pkg = require('../../package.json');
...
plugins : [
new webpack.DefinePlugin({
AppVersion: JSON.stringify(pkg.version),
...
然后,AppVersion
现在是一个可供您使用的全局版本。另外,请确保在您的中,对于那些寻求同样适用于服务器端的安全的客户端解决方案的人来说,有。它是一个命令行工具,从最近的package.json读取版本,并生成可导入的CommonJS模块文件,导出版本。免责声明:我是维护者
$ genversion lib/version.js
我承认客户端安全不是OP的主要目的,但正如和的回答中所讨论的,它是高度相关的,也是我发现此问答的原因。有两种检索版本的方法:
需要package.json
并获取版本:
使用环境变量:
请不要使用JSON.parse
,fs.readFile
,fs.readFileSync
并且不要使用另一个npm模块
这个问题不需要它。将您的package.json
文件导入到您的server.js
或app.js
中,然后将package.json属性访问到服务器文件中
var package = require('./package.json');
package变量包含package.json中的所有数据。我编写了一个有用的代码来获取父模块的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
}
您可以使用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}`);
要确定节点代码中的包版本,可以使用以下命令:
import {version} from './package.json';
const version=require('./package.json').version代码>用于
从'./package.json'导入{version}代码>用于ES6版本
const version=process.env.npm\u包\u版本代码>
如果已使用npm start
启动应用程序,则所有npm_*环境变量都将可用
您还可以使用以下npm包-root require、pkginfo、project version
为什么不使用require resolve
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
此方法适用于所有子路径:)如果使用rollup,则可以使用rollup plugin replace
插件添加版本,而无需向客户端公开package.json
//rollup.config.js
从“/package.json”导入pkg;
从“汇总插件terser”导入{terser};
从“汇总插件节点解析”导入解析;
从“汇总插件commonJS”导入commonJS
从“汇总插件替换”导入替换;
导出默认值{
插件:[
替换({
排除:'node_modules/**',
'MY_PACKAGE_JSON_VERSION':pkg.VERSION,//将在整个源代码中用PACKAGE.JSON版本替换'MY_PACKAGE_JSON_VERSION'
}),
]
};
然后,在源代码中,您希望获得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
选项1
最佳实践是使用npm环境变量从package.json进行版本转换
process.env.npm_package_version
更多信息
import {name as app_name, version as app_version} from './path/to/package.json';
console.log(`App ---- ${app_name}\nVersion ---- ${app_version}`);
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js
process.env.npm_package_version
import { version } from 'TARGET_PACKAGE/package.json';
import { version } from 'react/package.json';
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)
}
}
import { readFile } from 'fs/promises';
const pkg = JSON.parse(await readFile(new URL('./package.json', import.meta.url)));
console.log(pkg.version)
import pkg from './package.json'
console.log(pkg.version)