tl; dr Поскольку ваш вопрос показывает использование cross-var
, я предположил, что требуется кроссплатформенное решение. В этом случае см. Решение A . Однако, если моё предположение неверно, обратитесь либо к решению B , либо к C .
Для кроссплатформенного решения (то есть того, которое успешно работает в Windows, Linux и macOS ...) вам нужно будет использовать nodejs для достижения ваших требований. Есть несколько различных подходов к этому, как описано в следующих двух подразделах:
Примечание оба подхода фактически одинаковы
[ 1178] run-ng-build.js
const uuid = require('uuid/v1');
const execSync = require('child_process').execSync;
process.env.UUID = uuid();
execSync('ng build', { stdio: [0, 1, 2]} );
В разделе scripts
вашего package.json замените ваш текущий build
скрипт следующим:
package.json
"scripts": {
"build": "node run-ng-build"
}
Объяснение:
execSync()
. UUID
мы используем встроенную в nodejs process.env
и присваиваем ей значение uuid , вызывая uuid()
. ng build
, используя execSync
. options.stdio
настраивает каналы между родительским и дочерним процессами - [0, 1, 2]
эффективно наследует stdin
, stdout
и stderr
. В качестве альтернативы вы можете встроить свой код nodejs / JavaScript в раздел scripts
вашего package.json .
В разделе scripts
вашего package.json замените ваш текущий скрипт build
следующим:
package.json
"scripts": {
"build": "node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng build', { stdio: [0, 1, 2]} );\""
}
Объяснение:
.js
, однако использование отдельного сценария / файла nodejs теперь излишне. -e
используется для оценки встроенного JavaScript. Важно Пакет cross-env является избыточным с использованием любого из двух вышеупомянутых решений. Чтобы удалить его, запустите: npm un -D cross-env
через CLI.
Только для платформ * nix это становится очень кратким, вы можете просто определить свой скрипт build
в package.json выглядит следующим образом:
package.json
"scripts": {
"build": "cross-env UUID=$(uuid) ng build"
}
Это использует функцию Bash, известную как команда замещение , т.е. $(uuid)
. Однако, если * nix - единственная платформа, которую вам нужно поддерживать, тогда cross-env
действительно не требуется. Вместо этого используйте встроенную функцию экспорта . Например:
package.json
"scripts": {
"build": "export UUID=$(uuid) && ng build"
}
[ 1191] В Windows (только), запущенной через командную строку или PowerShell, вы можете сделать следующее:
package.json
"scripts": {
"build": "FOR /F %U IN ('uuid') DO cross-env UUID=%~U node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng buuld', { stdio: [0, 1, 2] });\""
}
This аналогичен первому примеру, показанному в Решение B , однако подстановка команд выполняется (очень) по-другому в cmd.exe . См. Этот ответ для дальнейшего объяснения.
Битовые поля, перенесенные из C. Имя
имеет ширину 40 бит, Цвет
имеет ширину 24 бита. Следовательно, ваша структура имеет как минимум 64 бита. В моей системе 64 бита были бы 8 байтами.
Да, это синтаксис битовых полей . Они обычно используются для определения структур, которые отображаются на аппаратные регистры. Есть некоторые вещи, которые следует иметь в виду, если вы решите их использовать, во-первых, вы не можете знать, как компилятор делает разметку, упорядочивание и заполнение в реальных байтах, составляющих поля, могут и будут различаться у разных компиляторов (и, возможно, с тем же компилятором, но и с другими настройками оптимизации).
Это определение битового поля.
Имя - это целое число, которое может хранить ровно 40 бит информации. Цвет может хранить 24 бита.
Это часто делается для того, чтобы сэкономить место в часто используемых структурах или сжать код до размера, который легко обрабатывать для ЦП (в вашем случае 64 бита. Вписывается точно в регистр ЦП на 64-битной машине).
Код, который обращается к битовым полям, будет выполняться чуть медленнее.
Помните, что почти все о битовые поля - это реализация зависимый. Например, биты ли хранятся слева направо или справа налево зависит от фактического аппаратная архитектура. Более того, каждый компилятор использует свой член модель выравнивания, поэтому размер оптимизированного BillingRec составляет 12 байтов, а не 9. Вы не можете взять адрес битового поля, вы не можете создать массивы битов. Наконец, на большинстве реализации использования битовых полей несёт скорость над головой. Поэтому, когда Вы оптимизируете свой код, измеряете эффект определенной оптимизации и его компромиссы, прежде чем вы решите использовать it.