Вопрос:

How can I inject a build number with webpack?

webpack

27415 просмотра

6 ответа

79504 Репутация автора

I'd like to inject a build number and version information to my project as it's built with webpack. For example, so that my code can do something like:

var buildInfo = require("build-info");

What would be the best way to generate that build-info module at build time?

Автор: David Wolever Источник Размещён: 09.07.2014 08:24

Ответы (6)


54 плюса

1139 Репутация автора

You can use the DefinePlugin that will make your build info available inlined with your code:

Config

new webpack.DefinePlugin({
   __VERSION__: JSON.stringify('12345')
})

App code

console.log(__VERSION__);
Автор: newtriks Размещён: 25.03.2015 09:54

3 плюса

920 Репутация автора

У меня есть два файла, которые я распространяю с номером сборки с точки зрения git и npm (package.json). Я все еще хотел бы вставить это в свой index.template.html в метатеге, но пока не понял этого (как я могу сделать DEFINE из содержимого файла или из вывода cmd?).

Для git я использую webpack-shell-plugin для создания файла с информацией git:

const WebpackVersionFilePlugin = require('webpack-version-file-plugin');
plugins: [
new WebpackShellPlugin({
      onBuildStart: [
        'git name-rev --name-only HEAD > dist/gitversion.txt',
        'git rev-list HEAD --count >> dist/gitversion.txt',
        'git rev-parse HEAD >> dist/gitversion.txt']
    }),

Для npm я добавляю команду версии npm («исправление версии npm / minor / major»), чтобы (1) убедиться, что в git нет незавершенных изменений - она ​​завершится неудачей, если есть, и (2) обновить версию package.json. и проверить это в мерзавце.

  "scripts": {
    "build": "npm run lint && npm run init && npm version patch && webpack --config webpack.config.js",

Затем я распространяю это, используя плохо документированный, возможно, с ошибками, WebpackVersionFilePlugin.

const WebpackVersionFilePlugin = require('webpack-version-file-plugin');
new WebpackVersionFilePlugin({
      packageFile:path.join(__dirname, 'package.json'),
      outputFile: path.join('./dist/', 'version.json')
    }),

Используя этот шаблон в верхнем каталоге:

{
  "version" : {
    "name":      "<% package.name %>",
    "buildDate": "<%= currentTime %>",
    "version":   "<%= package.version %>"
  }
}

Ни «package.name», ни «name» не работают.

Результат - два файла в моем ./dist/directory. gitversion.txt (ветвь, коммит, счет от головы):

fmwk/feathers
9cfe791a09d3d748e8120e0628
51

и version.json:

{
  "version" : {
    "name":      "",
    "buildDate": "Fri Oct 21 2016 11:10:12 GMT+0800 (PHT)",
    "version":   "0.6.2"
  }
}
Автор: Michael Bushe Размещён: 21.10.2016 03:37

13 плюса

131 Репутация автора

Есть плагин для автоматической вставки версии из package.json. Он может добавить его в html, css, js как комментарий, но также и как значение по специальному тегу https://www.npmjs.com/package/webpack-auto-inject-version

Как:

Прежде всего, вы должны добавить его в свой проект:

npm i webpack-auto-inject-version

Затем вам нужно настроить конфигурацию вашего веб-пакета:

var WebpackAutoInject = require('webpack-auto-inject-version');

module.exports = {
    plugins: [
        new WebpackAutoInject()
    ]
}

Поскольку вы хотите внедрить его в javascript, вы должны добавить тег в свой файл javascript (который будет изменен на версию во время компиляции веб-пакета)

var version = '[AIV]{version}[/AIV]';
console.log(version);

Авто увеличение:

Вы можете настроить его на автоматическое увеличение версии прямо из веб-пакета:

webpack --other-webpack-settings --major

webpack --other-webpack-settings -- minor

webpack --other-webpack-settings --patch

Где --other-webpack-settings соответствует вашим пользовательским аргументам строки. Упрощение - вам нужно указывать --major, --minor или --patch всякий раз, когда вы хотите автоматически увеличить версию.

Автор: Yabree Размещён: 24.10.2016 07:19

7 плюса

11484 Репутация автора

Вот мой рецепт, полученный из других ответов на этот вопрос. Это использует WebpackVersionFilePlugin и execa , и отлично работает для меня прямо сейчас.

Установите плагины через npm:

npm install webpack-version-file-plugin --save-dev
npm install execa --save-dev

webpack.config.js:

const WebpackVersionFilePlugin = require('webpack-version-file-plugin');
const execa = require('execa');

const gitHash = execa.sync('git', ['rev-parse', '--short', 'HEAD']).stdout;
const gitNumCommits = Number(execa.sync('git', ['rev-list', 'HEAD', '--count']).stdout);
const gitDirty = execa.sync('git', ['status', '-s', '-uall']).stdout.length > 0;

module.exports = {
// ... snip ...
plugins: [
    new WebpackVersionFilePlugin({
        packageFile: path.join(__dirname, 'package.json'),
        template: path.join(__dirname, 'version.ejs'),
        outputFile: path.join('build/ts/', 'version.json'),
        extras: {
            'githash': gitHash,
            'gitNumCommits': gitNumCommits,
            'timestamp': Date.now(),
            'dirty': gitDirty
        }
    }),
// ... snip ...

version.ejs (в корне проекта):

{
    "name":       "<%= package.name %>",
    "buildDate":  <%= extras.timestamp %>,
    "version":    "<%= package.version %>",
    "numCommits": <%= extras.gitNumCommits %>,
    "hash":       "<%= extras.githash %>",
    "dirty":      <%= extras.dirty %>
}

До сих пор, запустив это, мы получаем файл version.json build/tsс таким содержимым:

{
    "name":       "app name from package.json",
    "buildDate":  1518774257225,
    "version":    "2.0.1",
    "numCommits": 148,
    "hash":       "5a74b7a",
    "dirty":      false
}

dirtyФлаг указывает , если сборка включены неподтвержденные или неотслеживаемые изменения.

Я использую TypeScript, поэтому ниже описано, как вставить файл JSON в мой код TypeScript. Если у вас нет TypeScript, мы все еще сократили проблему до чтения файла JSON. :-)

app.ts:

import * as appVersionJson from './version.json';

export const appVersion: AppVersion = <any>appVersionJson;

export interface AppVersion {
    /** application name as specified in package.json */
    readonly name: string;

    /** build timestamp in milliseconds since the epoch */
    readonly buildDate: number;

    /** application version as specified in package.json */
    readonly version: string;

    /** number of commits in the Git repo */
    readonly numCommits: number;

    /** latest Git commit hash */
    readonly hash: string;

    /** flag is set when uncommitted or untracked changes are present in the workspace */
    readonly dirty: boolean;
}

// ...snip...
// now just use it in methods, for example:
appVersion.version + '.' + appVersion.numCommits + ' (' + appVersion.hash + ')'

Хорошо - надеюсь, что это даст еще некоторые подсказки о том, как получить хорошую информацию о номере сборки в коде. Кстати, версия npm - это хороший способ увеличить номера версий при такой работе.

Автор: barfuin Размещён: 16.02.2018 10:13

17 плюса

11524 Репутация автора

I would do more simpler, just use npm version patch (npm-version) (no plugin required)

package.json (Example path version before building)

{
  "version": "1.0.0",
  "scripts": {
    "build": "npm version patch && node build/build.js"
  }
}

So when you run npm run build this will patch the version (1.0.0 to 1.0.1 in your package.json)


Bonus: You can also add this to your config (example config/prod.env.js)

'use strict'
const pkg = require('./package.json')
module.exports = {
  NODE_ENV: '"production"',
  VERSION: pkg.version
}

Тогда вы можете использовать в process.env.VERSIONлюбом месте в нашем нашем JS

Обновлено: или просто использовать process.env.npm_package_version без обязательного включения package.json

Автор: l2aelba Размещён: 08.06.2018 11:03

0 плюса

79 Репутация автора

Я не мог заставить это работать с TypeScript, поэтому я помог себе, создавая файл при каждой компиляции.

webpack.config.js

const fs = require('fs'); 
const path = require('path'); 
fs.writeFileSync(path.resolve(path.join(__dirname, 'src/version.ts')), 
`// This file is auto-generated by the build system. 
const BundleVersion = "${ new Date().toISOString().substr(0, 10) }"; 
export default BundleVersion; 
`); 

Затем я просто import BundleVersion from './version'; проверяю, действительно ли он где-то используется (console.log или где-то его обнажает), чтобы он не был вытряхнут из дерева, вот и все, отметка времени (или версия) в пакете, созданная во время компиляции (прямая) Перейдите отсюда, чтобы прочитать package.json и при необходимости использовать версию пакета).

Автор: frevd Размещён: 11.05.2019 08:27
Вопросы из категории :
32x32