Как отобразить версию приложения в Angular?
Как отобразить версию приложения в угловом приложении? версия должна быть взята из файла package.json
{
"name": "angular-app",
"version": "0.0.1",
...
}
В угловой 1.x у меня есть этот HTML:
<p><%=version %></p>
В angular это не отображается как номер версии, а просто печатается как есть (<%=version %>
вместо 0.0.1
).
Ответы
Ответ 1
Если вы хотите использовать/показать номер версии в вашем угловом приложении, сделайте следующее:
Предпосылки:
-
Угловая структура файлов и папок, созданная с помощью Angular CLI
-
TypeScript 2.9 или более поздняя версия! (Поддерживается от Angular 6.1 и выше)
шаги:
- В вашем
/tsconfig.app.json
включите опцию resolJsonModule (после этого потребуется перезагрузка сервера):
"compilerOptions": {
...
"resolveJsonModule": true
...
- Затем в вашем компоненте, например,
/src/app/app.component.ts
используйте информацию о версии:
import { version } from '../../package.json';
...
export class AppComponent {
public version: string = version;
}
Также возможно выполнить шаг 2 в вашем файле environment.ts, делая информацию о версии доступной оттуда.
Спасибо @Ionaru и @MarcoRinck за помощь.
Это решение не будет включать содержимое package.json, только номер версии.
Протестировано с Angular8/Node10/TypeScript3.4.3.
Пожалуйста, обновите ваши приложения, чтобы использовать это решение, потому что в зависимости от содержимого вашего пакета. Исходное решение может вызывать проблемы с безопасностью.
Ответ 2
Если вы используете webpack или angular -cli (кто использует веб-пакет), вы можете просто потребовать package.json в своем компоненте и отобразить эту подсказку.
const { version: appVersion } = require('../../package.json')
// this loads package.json
// then you destructure that object and take out the 'version' property from it
// and finally with ': appVersion' you rename it to const appVersion
И тогда у вас есть свой компонент
@Component({
selector: 'stack-overflow',
templateUrl: './stack-overflow.component.html'
})
export class StackOverflowComponent {
public appVersion
constructor() {
this.appVersion = appVersion
}
}
Ответ 3
Попытка DyslexicDcuk ответ привела к cannot find name require
Тогда чтение раздела "Загрузка дополнительного модуля и другие расширенные сценарии загрузки" в https://www.typescriptlang.org/docs/handbook/modules.html помогло мне решить эту проблему. (Упоминается Гэри здесь fooobar.com/questions/231005/...)
Используйте декларацию ниже для запроса package.json.
declare function require(moduleName: string): any;
const {version : appVersion} = require('path-to-package.json');
Ответ 4
Используя опцию tsconfig --resolveJsonModule
вы можете импортировать файлы json в Typescript.
В файле environment.ts:
import { version } from '../../package.json';
export const environment = {
VERSION: version,
};
Теперь вы можете использовать environment.VERSION
в вашем приложении.
Ответ 5
Хорошая идея объявить version
как переменную окружения, чтобы вы могли использовать ее везде в своем проекте. (особенно в случае загрузки файлов для кэширования в зависимости от версии, eg yourCustomjsonFile.json?version=1.0.0
)
Чтобы предотвратить проблемы безопасности (как упоминалось @ZetaPR), мы можем использовать этот подход (в комментарии @sgwatgit)
Вкратце: мы создаем файл yourProjectPath\PreBuild.js. Как это:
const path = require('path');
const colors = require('colors/safe');
const fs = require('fs');
const dada = require.resolve('./package.json');
const appVersion = require('./package.json').version;
console.log(colors.cyan('\nRunning pre-build tasks'));
const versionFilePath = path.join(__dirname + '/src/environments/version.ts');
const src = 'export const version = '${appVersion}';
';
console.log(colors.green('Dada ${colors.yellow(dada)}'));
// ensure version module pulls value from package.json
fs.writeFile(versionFilePath, src, { flat: 'w' }, function (err) {
if (err) {
return console.log(colors.red(err));
}
console.log(colors.green('Updating application version
${colors.yellow(appVersion)}'));
console.log('${colors.green('Writing version module to
')}${colors.yellow(versionFilePath)}\n');
});
Вышеупомянутый фрагмент создаст новый файл /src/environments/version.ts
который содержит константу с именем version
и установит ее по извлеченному значению из файла package.json
.
Чтобы запустить содержимое PreBuild.json
при сборке, мы добавляем этот файл в раздел Package.json
→ "scripts": {... }"
как PreBuild.json
ниже. Таким образом, мы можем запустить проект, используя этот код: npm start
:
{
"name": "YourProject",
"version": "1.0.0",
"license": "...",
"scripts": {
"ng": "...",
"start": "node PreBuild.js & ng serve",
},...
}
Теперь мы можем просто импортировать версию и использовать ее где угодно:
import { version } from '../../../../environments/version';
...
export class MyComponent{
...
public versionUseCase: string = version;
}
Ответ 6
Я не думаю, что "Angle Bracket Percent" имеет какое-либо отношение к угловому. Вероятно, интерфейс к другому API, который вы не понимаете, используется в вашем предыдущем проекте.
Самое простое решение: просто введите номер версии вручную в свой HTML файл или сохраните его в глобальной переменной, если вы используете его в нескольких местах:
<script>
var myAppVersionNumber = "0.0.1";
</script>
...
<body>
<p>My App Version is: {{myAppVersionNumber}}</p>
</body>
Ваше более сложное решение: запустите шаг автоматизации сборки, который извлекает номер версии из вашего файла package.json, а затем перезаписывает ваш файл index.html(или файл js/ts), чтобы включить значение:
-
Можно просто импортировать или потребовать файл package.json, если вы работаете в среде, которая его поддерживает:
var version = require("../package.json").version;
-
Это также можно сделать в bash script, который читает package.json и
затем редактирует другой файл.
- Вы можете добавить NPM script или изменить свой старт script, чтобы использовать
дополнительные модули для чтения и записи файлов.
- Вы можете добавить grunt или gulp к
ваш конвейер, а затем используйте дополнительные модули для чтения или записи файлов.
Ответ 7
Typescript
import { Component, OnInit } from '@angular/core';
declare var require: any;
@Component({
selector: 'app-version',
templateUrl: './version.component.html',
styleUrls: ['./version.component.scss']
})
export class VersionComponent implements OnInit {
version: string = require( '../../../../package.json').version;
constructor() {}
ngOnInit() {
}
}
HTML
<div class="row">
<p class="version">{{'general.version' | translate}}: {{version}}</p>
</div>
Ответ 8
Упрощенное решение для пользователей с угловым кли.
Добавить declare module '*.json';
on src/typings.d.ts
А затем на src/environments/environment.ts
:
import * as npm from '../../package.json';
export const environment = {
version: npm.version
};
Готово :)
Ответ 9
Я попытался решить эту проблему немного по-другому, учитывая легкость и удобство обслуживания.
Я использовал скрипт bash для изменения версии всего приложения. Следующий скрипт запросит у вас желаемый номер версии, и то же самое применяется во всем приложении.
#!/bin/bash
set -e
# This script will be a single source of truth for changing versions in the whole app
# Right now its only changing the version in the template (e.g index.html), but we can manage
# versions in other files such as CHANGELOG etc.
PROJECT_DIR=$(pwd)
TEMPLATE_FILE="$PROJECT_DIR/src/index.html"
PACKAGE_FILE="$PROJECT_DIR/package.json"
echo ">> Change Version to"
read -p '>> Version: ' VERSION
echo
echo " #### Changing version number to $VERSION #### "
echo
#change in template file (ideally footer)
sed -i '' -E "s/<p>(.*)<\/p>/<p>App version: $VERSION<\/p>/" $TEMPLATE_FILE
#change in package.json
sed -i '' -E "s/\"version\"\:(.*)/\"version\"\: \"$VERSION\",/" $PACKAGE_FILE
echo; echo "*** Mission Accomplished! ***"; echo;
Я сохранил этот скрипт в файле с именем version-manager.sh в корне проекта, и в своем файле package.json я также создал скрипт для его запуска, когда необходимо изменить версию.
"change-version": "bash ./version-manager.sh"
Наконец, я могу просто изменить версию, выполнив
npm run change-version
Эта команда изменит версию в шаблоне index.html, а также в файле package.json. Ниже приведены несколько скриншотов из моего существующего приложения.
![enter image description here]()
![enter image description here]()
![enter image description here]()
![enter image description here]()
Ответ 10
Вы можете прочитать package.json так же, как и любой другой файл, с http.get, например:
import {Component, OnInit} from 'angular2/core';
import {Http} from 'angular2/http';
@Component({
selector: 'version-selector',
template: '<div>Version: {{version}}</div>'
})
export class VersionComponent implements OnInit {
private version: string;
constructor(private http: Http) { }
ngOnInit() {
this.http.get('./package.json')
.map(res => res.json())
.subscribe(data => this.version = data.version);
}
}
Ответ 11
При использовании Angular 2 с Typescript и Webpack вы также можете использовать (а не требовать):
import * as packageObject from '[relative path to]/package.json';
и чтобы получить номер версии, просто напишите:
packageObject.version
Ответ 12
В nodejs Command promt
C:\Users\Username > node -v это для версии nodejs,
C:\Users\Username > npm -v это для версии npm.