Nodejs kodunda package.json'dan sürüm almanın bir yolu var mı?


586

Sürümü package.jsonbir nodejs uygulamasında almanın bir yolu var mı ? Böyle bir şey isterdim

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

Düğüm sürümünü veya package.json'da bildirilen sürümü edinmek daha mı önemli? Eğer form, bu size çalışan sürümü verecektir:console.log(process.version)
Adrian Lynch

Yanıtlar:


957

Aşağıdaki kod parçasının benim için en uygun olduğunu buldum. requireYüklemek için kullandığı için package.json, geçerli çalışma dizinine bakılmaksızın çalışır.

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

@Pathogen'in izniyle:

Bunu Browserify ile yapmanın güvenlik etkileri vardır. Tüm bağımlılık sürüm numaralarınızın, derleme ve test komutlarınızın ve daha fazlasının istemciye gönderildiği anlamına geldiği için istemcinize
maruz kalmamaya dikkat edin package.json.
Aynı projede sunucu ve istemci oluşturuyorsanız, sunucu tarafı sürüm numaralarınızı da açığa çıkarırsınız. Bu tür belirli veriler, saldırgan tarafından sunucunuza yapılan saldırıyı daha iyi sığdırmak için kullanılabilir.


25
(olduğu gibi) farklı yerlerden require('root-require')('package.json').version
kapmaya çalışarak yanmaya devam

5
Global yüklü shebang ile benim senaryo için çalışmıyor. Error: Cannot find module 'package.json'.
2015'te

14
daha kısa - gerektirir ('./ paket') sürüm
Afanasii Kurakin

60
Uyarı! Bunu browserify ile yapmanın güvenlik etkileri vardır: paketinizdeki package.json, tüm bağımlılık sürüm numaralarınızın, derleme ve test komutlarınızın ve daha fazlasının istemciye gönderildiği anlamına gelir. Aynı projede sunucu ve istemci oluşturuyorsanız, sunucu tarafı sürüm numaralarınızı da açığa çıkarırsınız.
Patojen

4
@ Patogen genversionu müşteri tarafında sorunu çözer. Bu sürümü package.json'dan okuyan ve ondan içe aktarılabilir bir modül üreten bir araçtır. Feragatname: Ben bir bakıcıyım.
Akseli Palén

348

Uygulamanız 'npm start' ile başlatılırsa, şunları kullanabilirsiniz:

process.env.npm_package_version

Daha fazla bilgi için package.json vars dosyasına bakın.


6
bu muhtemelen en iyi yanıttır. çünkü package.json'daki bilgilerin çoğu süreç çalışma zamanı değişkenine bağlıdır
Alexander Mills

2
Evet, katılıyorum. Bu doğru yanıt olmalı, package.json dosyasını açıp tekrar okumaya gerek duymadığınız işlem değişkenini kullanarak.
Juanma

12
Ve düğüm dışında (örn., Üzerinden çalıştırılan kabuk komut dosyaları npm run …) sürüm ortam değişkeninde olacaktır $npm_package_version.
Quinn Comendant

12
Başka bir paketin komut dosyalarından çağrıldığında , çağrılan paketi değil, çağrı paketinin sürümünü yanlış bildirir .
jjrv

6
Bir elektron uygulamasında başlayan bir elektron uygulamasında çalışır npm start, ancak yerleşik bir elektron uygulamasında çalışmaz: bunun için bulabilirsiniz app.getVersion.
ChrisV

158

ES6 modüllerini kullanarak aşağıdakileri yapabilirsiniz:

import {version} from './package.json';

2
Bunların düğümde desteklenmediğini düşündüm: github.com/nodejs/help/issues/53
ripper234

1
Hiçbir es6 modülü henüz doğrudan desteklenmemekte, ancak yine de yaygın olarak kullanılmaktadır, Babel kullanılarak etkinleştirilmiştir
Patrick Lee Scott

4
@Sornii hayır, tüm paket.json istemci olacak. Düğüm ortamından tarayıcıya yalnızca seçilen bilgileri aktarmak için webpack'in definePlugin'i kullandım.
doeke

2
Stackoverflow.com/a/10855054/540144 adresinde belirtildiği gibi herhangi bir güvenlik etkisi var mı?
itsazzad

1
Evet, aynı güvenlik sorunları. Bütün package.json istemci paketine dahil edilecektir.
Neromancer

94

Veya düz eski kabukta:

node -e "console.log(require('./package.json').version);"

Bu kısaltılabilir

node -p "require('./package.json').version"

Sorunun tam olarak sorduğu soru bu olmasa da, sürümü package.jsonkendi içinde kullanmak istiyorsanız , örneğin aşağıdakilerdeki sürümlü bir dosyaya giriş yapmak yararlı olur 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",
  ...
}

Bu istendiği gibi nodeJS uygulaması içinde değil.
Steve Bennett

1
@SteveBennett Hayır, ama 90 kişinin bana yardım etmesine yardımcı oldu.
K - SO'da toksisite artıyor.

1
Muhtemelen bundan çok daha fazlası.
Steve Bennett

61

Sürümü almanın iki yolu vardır:

  1. package.jsonSürümü zorunlu kılmak ve almak:
const { version } = require('./package.json');
  1. Ortam değişkenlerini kullanma:
const version = process.env.npm_package_version;

Lütfen kullanmayın JSON.parse, fs.readFile, fs.readFileSyncve başka kullanmayan npm modulesbu soru için gerekli değildir.


2
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde uzun vadeli değer artıracak göstererek neden bu soruna iyi bir çözüm olduğunu ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
milo526

8
Bu durumda npm_*ortam değerleri yalnızca komut dosyanız NPM tarafından başlatılmışsa kullanılabilir npm start; Eğer node app.jsya da benzer bir şey yapıyorsanız , onlar orada olmayacaklar.
Nate

@Nate Yani sürümü kullanmak daha iyidir package.json?
Filip Š

38

Package.json sürümü nasıl okunur:

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

Bunu bir grup gördüm ve beğendim - siz / kimse require() introduces? (for instance, does utf8 okumayı desteklemeyen () `ı gerektiren hususları biliyor musunuz? snippet'inizin önerebileceği gibi)
elektblake

4
require()Bu durumda bir fark yaratmaması gereken dosyayı önbelleğe alır.
jlee

@jlee insanların yeniden yüklemek istedikleri zamanlar JSON.parse(fs.readFileSync('package.json', 'utf8'))yerine sık sık yaptıkları bir neden var delete require.cache[require.resolve('package.json')]; require('package.json')mı?
Mihail Malostanidis

const {version} = zorunlu ('./ package.json');
аlex dykyі

23

Pkginfo modülünü package.jsonkullanarak dosyanızdan belirli bilgileri almanın başka bir yolu var .

Bu modülün kullanımı çok basittir. Tüm paket değişkenlerini aşağıdakileri kullanarak alabilirsiniz:

require('pkginfo')(module);

Veya yalnızca belirli ayrıntılar ( versionbu durumda)

require('pkginfo')(module, 'version');

Ve paket değişkenleriniz olarak ayarlanacaktır module.exports(bu nedenle sürüm numarasına şuradan erişilebilir module.exports.version).

Aşağıdaki kod snippet'ini kullanabilirsiniz:

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

Bu modül çok güzel bir özelliğe sahiptir - projenizdeki herhangi bir dosyada (örneğin alt klasörlerde) kullanılabilir ve otomatik olarak bilgisayarınızdan bilgi alır package.json. Yani nerede olduğun için endişelenmene gerek yok package.json.

Umarım yardımcı olur.


1
moduleburada ne var
chovy

@chovy, modulebu özel örnek değişken değildir; node.js'de geçerli modülü temsil eden bir değişkendir. Node.js modülleri hakkında daha fazla bilgiyi buradan edinebilirsiniz: nodejs.org/api/modules.html#modules_the_module_object
Tom

2
Modülüm için gerekli olan diğer modüllerin sürümünü almaya çalışıyorum ... ve pkginfo bunu mümkün kılıyor mu anlamaya zorlanıyorum.
Michael

23

Sunucu tarafında da çalışan güvenli bir istemci tarafı çözümü arayanlar için bir çeşitlilik var . En yakın paket.json'dan sürümü okuyan ve sürümü dışa aktarabilen içe aktarılabilir bir CommonJS modül dosyası oluşturan bir komut satırı aracıdır. Feragatname: Ben bir bakıcıyım.

$ genversion lib/version.js

Müşteri tarafı güvenliğin OP'nin birincil amacı olmadığını, ancak Mark Wallace ve aug'un cevaplarında tartışıldığı gibi, son derece alakalı olduğunu ve aynı zamanda bu Soru- Cevap'yı bulmamın nedenini kabul ediyorum.


4
Bu cevap ve şu anda üstte derin sorunlu cevabın üstesinden gelmek için daha fazla oy gerekiyor.
Jeff Allen

1
Bazı insanlar, bunun bir komut satırı aracı olduğu için endişelenebilir. Endişelenme! Aracın benioku, build.cson çağrısının paketine nasıl kolayca entegre edileceğini açıklar, böylece aracın varlığını unutabilir ve her zaman en son sürüm numarasına sahip olabilirsiniz.
malamut

11

Sadece bir cevap eklemek çünkü bu uygulamayı web uygulamama package.json sürümü dahil etmenin en iyi yolunu görmek için geldi.

Bununla birlikte, bu sorunun Node.js için hedeflendiğini biliyorum, ancak uygulamanızı paketlemek için Webpack kullanıyorsanız, önerilen yol, yapılandırmada global bir sürüm bildirmek ve referans vermek için DefinePlugin'i kullanmaktır . Böylece yapabilirsinwebpack.config.json

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

...

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

Ve sonra AppVersionartık kullanabileceğiniz bir küresel. Ayrıca bunu global pervane aracılığıyla yok saydığınızdan emin olun.eslintrc


8

seçenek 1

En iyi uygulama npm ortam değişkenlerini kullanarak package.json sitesinden versiyon almaktır.

process.env.npm_package_version

hakkında daha fazla bilgi: https://docs.npmjs.com/using-npm/config.html

Bu yalnızca hizmetinizi NPM komutunu kullanarak başlattığınızda çalışır.

Hızlı Bilgi: pacakge.json'daki herhangi bir değeri process.env.npm_package_ [keyname] kullanarak okuyabilirsiniz

seçenek 2

Https://www.npmjs.com/package/dotenv.env dosyasını dosya olarak kullanarak ve onunla ilgili olarak ortam değişkenindeki sürümü ayarlamaprocess.env.version


7

Sürüm numarasını almak ve sürümün konsolda çıktısını almak için package.json dosyasını içe aktarmak için ES6'yı kullanabilirsiniz.

import {name as app_name, version as app_version}  from './path/to/package.json';

console.log(`App ---- ${app_name}\nVersion ---- ${app_version}`);

3
Bu, tsconfig.json içinde "resolJsonModule" öğesini "true" olarak ayarladığınız sürece çalışır.
Russell Phillips

6

Düğüm kodundaki paket sürümünü belirlemek için aşağıdakileri kullanabilirsiniz:

  1. const version = require('./package.json').version; <ES6 sürümleri için

  2. import {version} from './package.json'; ES6 sürümü için

  3. const version = process.env.npm_package_version; uygulama kullanılmaya başlandıysa npm start, tüm npm_ * ortam değişkenleri kullanılabilir hale gelir.

  4. Aşağıdaki npm paketlerini de kullanabilirsiniz - root-requir, pkginfo, project-version.


4

Sen kullanabilirsiniz proje sürüm paketi.

$ npm install --save project-version

Sonra

const version = require('project-version');

console.log(version);
//=>  '1.0.0'

Env değişkeninin bir nedenden dolayı eksik olması durumunda process.env.npm_package_versionyazılan sürümde geri dönüş kullanır package.json.


Örneğin, js dosyası npm'den başlatılmamışsa?
Mihail Malostanidis

1

Bunu şu şekilde yaparım findup-sync:

var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1' 

find, cwd ile başlar, bu nedenle çoğu durumda npm yoluyla başlatılmasını gerektirmez package.json, sadece en üst seviyeye process.env.npm_package_versionulaşır. Bu yüzden kütüphane sürümünüzü almaya çalışmak aslında arayanın sürümünü alır. Basit bir gereksinim ('./ package.json') bundan kaçınır.
Mihail Malostanidis

1

Bunun OP'nin amacı olmadığını biliyorum, ama bunu yapmak zorundaydım, bu yüzden umarım bir sonraki kişiye yardımcı olur.

CI / CD işleminiz için docker-compose kullanıyorsanız, bunu bu şekilde alabilirsiniz!

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', '')\""

görüntü için, herhangi bir düğüm görüntüsünü kullanabilirsiniz. Alpin kullanıyorum çünkü en küçük olanı.


1

Neden gerekli çözümü kullanmıyorsunuz?

const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)

Bu yaklaşımla tüm alt yollar için çalışır :)


0

Senin içe package.jsonsizin dosyayı server.jsveya app.jssunucu dosyası içine ve sonra da erişim package.json özelliklerine.

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

package değişkeni package.json içindeki tüm verileri içerir.


0

Üst modülün paketini almak için kullanışlı bir kod yaptım.

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
}

0

Toplama rollup-plugin-replacekullanılıyorsa, eklenti, package.json dosyasını istemciye göstermeden sürümü eklemek için kullanılabilir.

// 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
    }),
  ]
};

Ardından, kaynak kodda, package.json sürümüne sahip olmak istediğiniz her yerde, 'MY_PACKAGE_JSON_VERSION' dizesini kullanırsınız.

// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.