有没有办法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
有没有办法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
Answers:
我发现以下代码片段最适合我。由于它用于require
加载package.json
,因此无论当前工作目录如何,它都可以工作。
var pjson = require('./package.json');
console.log(pjson.version);
@Pathogen提供的警告:
使用Browserify这样做会带来安全隐患。
注意不要将您package.json
的信息公开给客户端,因为这意味着所有依赖项版本号,构建和测试命令以及更多信息都将发送给客户端。
如果要在同一项目中构建服务器和客户端,则也要公开服务器端版本号。攻击者可以使用此类特定数据来更好地应对服务器上的攻击。
require('root-require')('package.json').version
Error: Cannot find module 'package.json'
。
npm run …
),版本将在环境变量中$npm_package_version
。
使用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",
...
}
有两种获取版本的方法:
package.json
并获取版本:const { version } = require('./package.json');
const version = process.env.npm_package_version;
请不要使用JSON.parse
,fs.readFile
,fs.readFileSync
并且不使用另一种npm modules
,没有必要为这个问题。
npm_*
,仅当脚本由NPM启动时,环境值才可用npm start
。如果您正在执行node app.js
类似操作,则它们将不存在。
package.json
?
这是从package.json中读取版本的方法:
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
require() introduces? (for instance, does
require()不支持utf8阅读的注意事项吗?为您的片断可能会建议)
require()
缓存文件,在这种情况下应该没有什么区别。
JSON.parse(fs.readFileSync('package.json', 'utf8'))
而不是delete require.cache[require.resolve('package.json')]; require('package.json')
何时要重新加载吗?
还有另一种从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
。
我希望这会有所帮助。
module
什么
module
不是这个特定的示例变量;它是代表node.js中当前模块的变量。您可以在此处阅读有关node.js模块的更多信息:nodejs.org/api/modules.html#modules_the_module_object
对于那些寻求在服务器端也可以使用的安全客户端解决方案的人来说,可以使用genversion。这是一个命令行工具,可从最近的package.json中读取版本,并生成可导入的CommonJS模块文件,以导出该版本。免责声明:我是维护者。
$ genversion lib/version.js
我承认客户端安全不是OP的主要意图,但是正如Mark Wallace和aug的回答所讨论的那样,它与客户的需求高度相关,也是我找到此问答的原因。
只是添加一个答案是因为我遇到了这个问题,以查看在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
通过globals prop忽略了这一点
选项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
您可以使用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}`);
要确定节点代码中的软件包版本,可以使用以下命令:
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。
您可以使用项目版本包。
$ npm install --save project-version
然后
const version = require('project-version');
console.log(version);
//=> '1.0.0'
如果由于某种原因缺少env var,它将使用process.env.npm_package_version
但回退到编写的版本package.json
。
我这样做findup-sync
:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
package.json
,类似于process.env.npm_package_version
不要求通过npm启动它。因此,尝试获取您的库版本实际上会获取调用方的版本。一个简单的require('./ package.json')可以避免这种情况。
我知道这不是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', '')\""
对于图像,您可以使用任何节点图像。我使用阿尔卑斯山,因为它是最小的。
为什么不使用需求解决方案...
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
用这种方法可以处理所有子路径:)
我做了一个有用的代码来获取父模块的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
}
如果使用汇总,该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
console.log(process.version)