From 4024d371b6eaa84ed30e2b903c07013cae3c7346 Mon Sep 17 00:00:00 2001 From: imeepos <1037483576@qq.com> Date: Wed, 1 May 2019 21:03:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PLATFORM=5FID=E5=92=8CNGER=5F?= =?UTF-8?q?CONFIG=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/config.json | 11 +++--- packages/nger-cli/lib/build/build.ts | 10 ++--- packages/nger-compiler-preact/lib/html.ts | 10 ++++- packages/nger-compiler-preact/lib/index.ts | 16 ++++---- packages/nger-compiler-preact/lib/preact.ts | 8 ++-- .../nger-core/lib/platform/platform_core.ts | 16 ++++---- packages/nger-core/lib/sdk/nger-config.ts | 39 ++++++++++++++++++- packages/nger-core/lib/tokens.ts | 5 +++ packages/nger-platform-node/lib/index.ts | 14 ++++++- packages/nger-util/lib/index.ts | 33 +++++----------- 10 files changed, 105 insertions(+), 57 deletions(-) diff --git a/config/config.json b/config/config.json index 686a726..97c3b25 100644 --- a/config/config.json +++ b/config/config.json @@ -12,10 +12,9 @@ "name": "nger", "synchronize": true }, - "weapp": { - "outputDir": "addons", - "sourceDir": "src", - "templateDir": ".temp", - "npmDir": "npm" - } + "admin": "src/admin.ts", + "h5": "src/app.ts", + "pc": "src/pc.ts", + "weapp": "src/app.ts", + "alipay": "src/app.ts" } \ No newline at end of file diff --git a/packages/nger-cli/lib/build/build.ts b/packages/nger-cli/lib/build/build.ts index f67c75c..02d81aa 100644 --- a/packages/nger-cli/lib/build/build.ts +++ b/packages/nger-cli/lib/build/build.ts @@ -1,5 +1,5 @@ import { TypeContext, Type } from 'ims-decorator'; -import { Injectable } from 'nger-core'; +import { Injectable, PLATFORM_ID } from 'nger-core'; import ngerPlatformNode from 'nger-platform-node' import gulp from 'gulp'; import chalk from 'chalk'; @@ -34,10 +34,10 @@ export class NgerCliBuild { ios(context: TypeContext) { } /** 后台 */ admin() { - console.log(`admin`) - platformBuildAdmin([]).bootstrapModule(NgerCliBuildAminBuilder).then(ref => { - - }) + platformBuildAdmin([{ + provide: PLATFORM_ID, + useValue: 'admin' + }]).bootstrapModule(NgerCliBuildAminBuilder).then(ref => { }) } async dev(name: string) { diff --git a/packages/nger-compiler-preact/lib/html.ts b/packages/nger-compiler-preact/lib/html.ts index a9a4d41..ed13d22 100644 --- a/packages/nger-compiler-preact/lib/html.ts +++ b/packages/nger-compiler-preact/lib/html.ts @@ -1,7 +1,15 @@ // 将ng模板编译成preact可以执行的文件 import { NgModuleConfig } from './types' +import { Injector } from 'nger-di'; +import { ComponentFactoryResolver } from 'nger-core'; + +// 需要将模板转换成preact export class NgerCompilerPreactHtml { + constructor(public injector: Injector) { } async run(config: NgModuleConfig) { - + const { declarations } = config; + declarations.map(comp => { + console.log(comp) + }); } } diff --git a/packages/nger-compiler-preact/lib/index.ts b/packages/nger-compiler-preact/lib/index.ts index e497b72..d0c8136 100644 --- a/packages/nger-compiler-preact/lib/index.ts +++ b/packages/nger-compiler-preact/lib/index.ts @@ -3,27 +3,25 @@ import { NgerCompilerPreactHtml } from './html' import { NgerCompilerPreactStyle } from './style' import { NgerCompilerPreactTypescript } from './typescript' import { NgerCompilerPreactAssets } from './assets' -import { StaticProvider } from 'nger-di'; +import { StaticProvider, Injector } from 'nger-di'; import { NgerCompilerNgMetadata } from 'nger-compiler' -import { NgModuleBootstrap } from 'nger-core' +import { NgModuleBootstrap, NgerConfig } from 'nger-core' const provider: StaticProvider[] = [{ provide: NgModuleBootstrap, - useExisting: NgerCompilerPreact, - multi: true -}, { - provide: NgerCompilerPreact, useClass: NgerCompilerPreact, deps: [ NgerCompilerPreactHtml, NgerCompilerPreactStyle, NgerCompilerPreactAssets, NgerCompilerPreactTypescript, - NgerCompilerNgMetadata - ] + NgerCompilerNgMetadata, + NgerConfig + ], + multi: true }, { provide: NgerCompilerPreactHtml, useClass: NgerCompilerPreactHtml, - deps: [] + deps: [Injector] }, { provide: NgerCompilerPreactStyle, useClass: NgerCompilerPreactStyle, diff --git a/packages/nger-compiler-preact/lib/preact.ts b/packages/nger-compiler-preact/lib/preact.ts index bbd2712..70e67e1 100644 --- a/packages/nger-compiler-preact/lib/preact.ts +++ b/packages/nger-compiler-preact/lib/preact.ts @@ -1,4 +1,4 @@ -import { NgModuleBootstrap, NgModuleRef } from 'nger-core'; +import { NgModuleBootstrap, NgModuleRef, PLATFORM_ID, NgerConfig } from 'nger-core'; // 将ng模板编译成preact可以执行的文件 import { NgerCompilerPreactHtml } from './html' import { NgerCompilerPreactStyle } from './style' @@ -15,14 +15,16 @@ export class NgerCompilerPreact extends NgModuleBootstrap { public style: NgerCompilerPreactStyle, public assets: NgerCompilerPreactAssets, public ts: NgerCompilerPreactTypescript, - public metadata: NgerCompilerNgMetadata + public metadata: NgerCompilerNgMetadata, + public config: NgerConfig ) { super(); } async run(ref: NgModuleRef) { const ngModule = ref.context.getClass(core.NgModuleMetadataKey) as core.NgModuleClassAst; // 拿到ngModule的文件名 - const fileName = ngModule.ast.metadataDef.fileName; + const platform = ref.injector.get(PLATFORM_ID); + const fileName = this.config[platform]; if (fileName) { // 拿到ngModuleMetadata const metadata = this.metadata.getMetadata(fileName); diff --git a/packages/nger-core/lib/platform/platform_core.ts b/packages/nger-core/lib/platform/platform_core.ts index 6f099f9..d89c85a 100644 --- a/packages/nger-core/lib/platform/platform_core.ts +++ b/packages/nger-core/lib/platform/platform_core.ts @@ -13,6 +13,7 @@ import { ChangeDetectorRef, DefaultChangeDetectorRef } from './change_detector_r import { ApplicationRef } from './application_ref' import { ComponentCreator } from './component_factory' import { PLATFORM_INITIALIZER } from './application_tokens' +import { NGER_CONFIG, INgerConfig } from '../sdk/nger-config' export const platformCore = createPlatformFactory(null, 'core', [{ provide: APP_INITIALIZER, useValue: () => { }, @@ -82,19 +83,20 @@ export const platformCore = createPlatformFactory(null, 'core', [{ return new ScannerVisitor(scanner) }, deps: [Injector] +}, { + provide: NGER_CONFIG, + useValue: {}, + multi: true }, { provide: NgerConfig, - useFactory: () => { - const config = new NgerConfig(); - config.watch = true; - config.loggerLevel = LoggerLevel.debug; + useFactory: (config: INgerConfig[]) => { + return new NgerConfig(config || []); }, - deps: [], - multi: true + deps: [NGER_CONFIG] }, { provide: Logger, useFactory: (config: NgerConfig) => { - return new ConsoleLogger(config.loggerLevel || LoggerLevel.debug) + return new ConsoleLogger(config.get('loggerLevel') as LoggerLevel || LoggerLevel.debug) }, deps: [NgerConfig] }]); diff --git a/packages/nger-core/lib/sdk/nger-config.ts b/packages/nger-core/lib/sdk/nger-config.ts index 4a4b2e7..5325415 100644 --- a/packages/nger-core/lib/sdk/nger-config.ts +++ b/packages/nger-core/lib/sdk/nger-config.ts @@ -6,7 +6,7 @@ export enum LoggerLevel { error, } import { ConnectionOptions } from 'typeorm'; -export class NgerConfig { +export interface INgerConfig { // 是否监控文件变化 watch: boolean; // 打印日志等级 @@ -20,4 +20,41 @@ export class NgerConfig { }; // db db: ConnectionOptions; + admin: string; + h5: string; + pc: string; + weapp: string; + alipay: string; +} +import { InjectionToken } from 'nger-di'; +import { Inject } from '../decorators/inject'; +type INgerConfigKey = keyof INgerConfig; +export const NGER_CONFIG = new InjectionToken(`NGER_CONFIG`) +export class NgerConfig { + config: any = {} + constructor(@Inject(NGER_CONFIG) configs: INgerConfig[]) { + if (Array.isArray(configs)) { + configs.map(cfg => { + this.config = { + ...this.config, + ...cfg + } + }) + } else { + console.log(configs) + } + } + + get(name: INgerConfigKey): INgerConfig[INgerConfigKey] { + const config: any = this.config[name]; + if (config) { + return config + } else { + return config; + } + } + + set(name: INgerConfigKey, value: INgerConfig[INgerConfigKey]) { + this.config[name] = value; + } } diff --git a/packages/nger-core/lib/tokens.ts b/packages/nger-core/lib/tokens.ts index e41519f..e016782 100644 --- a/packages/nger-core/lib/tokens.ts +++ b/packages/nger-core/lib/tokens.ts @@ -14,3 +14,8 @@ export type DevModel = boolean; export const DevModelToken = new InjectionToken(`DevModelToken`); // 运行平台 export const PlatformToken = new InjectionToken(`PlatformToken`); +// 平台 +export type PlatformId = 'lib' | 'h5' | 'prod' | 'wechat' | 'weapp' | 'alipay' | 'swap' | 'tt' | 'android' | 'ios' | 'admin' +export const PLATFORM_ID = new InjectionToken(`PLATFORM_ID`) +// webapck打包 +export const APP_ROOT = new InjectionToken(`APP_ROOT`) \ No newline at end of file diff --git a/packages/nger-platform-node/lib/index.ts b/packages/nger-platform-node/lib/index.ts index 0c57d06..6a47eab 100644 --- a/packages/nger-platform-node/lib/index.ts +++ b/packages/nger-platform-node/lib/index.ts @@ -1,4 +1,4 @@ -import { createPlatformFactory, Logger, FileSystem, Resolver } from 'nger-core' +import { createPlatformFactory, Logger, FileSystem, Resolver, NgerConfig, APP_ROOT, NGER_CONFIG } from 'nger-core' import { NgerUtil } from 'nger-util' import ngerPlatformAxios from 'nger-platform-axios' import fs from 'fs-extra'; @@ -9,6 +9,18 @@ import { ResolverFactory } from 'enhanced-resolve'; export default createPlatformFactory(ngerPlatformAxios, 'node', [ + { + provide: APP_ROOT, + useValue: process.cwd() + }, + { + provide: NGER_CONFIG, + useFactory: (root: string) => { + return require(join(root, 'config/config.json')) + }, + deps: [APP_ROOT], + multi: true + }, { provide: NgerUtil, useClass: NgerUtil, diff --git a/packages/nger-util/lib/index.ts b/packages/nger-util/lib/index.ts index 2672841..c4e567f 100644 --- a/packages/nger-util/lib/index.ts +++ b/packages/nger-util/lib/index.ts @@ -1,23 +1,11 @@ import { exec } from 'shelljs'; import { execSync } from 'child_process'; import { join } from 'path'; -import { existsSync } from 'fs'; import { Logger, NgerConfig } from 'nger-core'; import { CompilerOptions } from 'typescript' export class NgerUtil { root: string = process.cwd() constructor(public logger: Logger, public config: NgerConfig) { } - /** 加载配置文件 */ - loadConfig(): NgerConfig { - const configPath = join(this.root, 'config/config.json'); - if (this.config) { - return this.config; - } - if (existsSync(configPath)) { - this.config = require(join(this.root, 'config/config.json')); - } - return this.config; - } getCompilerOptions(): CompilerOptions { return require(join(this.root, 'tsconfig')).compilerOptions @@ -42,20 +30,17 @@ export class NgerUtil { } /** 安装包 */ addPkg(name: string) { - let cfg = this.loadConfig(); let command: string = ''; - if (!cfg) { - // cnpm 优先 - cfg = cfg || { npm: 'yarn' } as any; - if (this.shouldUseYarn()) { - cfg.npm = 'yarn'; - } else if (this.shouldUseCnpm()) { - cfg.npm = 'cnpm'; - } else { - cfg.npm = 'npm'; - } + // cnpm 优先 + if (this.shouldUseYarn()) { + this.config.set('npm', 'yarn') + } else if (this.shouldUseCnpm()) { + this.config.set('npm', 'cnpm') + } else { + this.config.set('npm', 'npm') } - switch (cfg.npm) { + const npm = this.config.get('npm'); + switch (npm) { case 'yarn': command = `yarn add ${name}` break;