在库中使用schematics——ng add与ng update
起步
创建一个angular库
ng new demo --create-application=false
ng g library my-lib
可见如下目录结构
├── node_modules/
├── projects
│ └── my-lib
│ ├── src
│ │ ├── lib
│ │ ├── public-api.ts
│ │ └── test.ts
│ ├── karma.conf.js
│ ├── ng-package.json
│ ├── package.json
│ ├── README.md
│ ├── tsconfig.lib.json
│ ├── tsconfig.lib.prod.json
│ ├── tsconfig.spec.json
│ └── tslint.json
├── README.md
├── package.json
├── .editorconfig
├── angular.json
├── tsconfig.base.json
├── tslint.json
└── tsconfig.json
添加projects/my-lib/schematics/collection.json文件
{
"$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json",
"schematics": {
"ng-add": {
"description": "Add my library to the project.",
"factory": "./ng-add/index#ngAdd"
}
}
}
修改projects/my-lib/package.json文件
{
"name": "my-lib",
"version": "0.0.1",
"schematics": "./schematics/collection.json",
}
添加projects/my-lib/schematics/ng-add/index.ts文件
import { Rule, SchematicContext, Tree } from '@angular-devkit/schematics';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { strings } from '@angular-devkit/core';
// Just return the tree
export function ngAdd(options: any): Rule {
return (tree: Tree, context: SchematicContext) => {
context.addTask(new NodePackageInstallTask());
// 如果不是 Angular 项目则抛出错误
const workspaceConfig = tree.read('angular.json');
if (!workspaceConfig) {
throw new SchematicsException('Not an Angular CLI workspace');
}
const templateSource = apply(url('./files'), [
applyTemplates({
...strings
}),
move(normalize('')),
]);
return chain([mergeWith(templateSource)]);
};
}
添加projects/my-lib/schematics/ng-add/files 文件
└── files
└──index.ts
index.ts内容如下
// #docregion template
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class <%= classify(name) %>Service {
constructor(private http: HttpClient) { }
}
定义依赖类型,在projects/my-lib/package.json中添加
"ng-add": {
"save": "devDependencies"
}
修改projects/my-lib/tsconfig.schematics.json
{
"compilerOptions": {
"baseUrl": ".",
"lib": [
"es2018",
"dom"
],
"declaration": true,
"module": "commonjs",
"moduleResolution": "node",
"noEmitOnError": true,
"noFallthroughCasesInSwitch": true,
"noImplicitAny": true,
"noImplicitThis": true,
"noUnusedParameters": true,
"noUnusedLocals": true,
"rootDir": "schematics",
"outDir": "../../dist/my-lib/schematics",
"skipDefaultLibCheck": true,
"skipLibCheck": true,
"sourceMap": true,
"strictNullChecks": true,
"target": "es6",
"types": [
"jasmine",
"node"
]
},
"include": [
"schematics/**/*"
],
"exclude": [
"schematics/*/files/**/*"
]
}
| 属性 | 说明 |
|---|---|
| rootDir | 指出在你的 schematics/ 文件夹中包含要编译的输入文件。 |
| outDir | 映射到了库的输出目录下。默认情况下,这是工作空间根目录下的 dist/my-lib 文件夹 |
修改projects/my-lib/package.json
{
"name": "my-lib",
"version": "0.0.1",
"scripts": {
"build": "../../node_modules/.bin/tsc -p tsconfig.schematics.json",
"copy:files": "cp --parents -p -r schematics/*/files/** ../../dist/my-lib/",
"copy:collection": "cp schematics/collection.json ../../dist/my-lib/schematics/collection.json",
"postbuild":"npm run copy:files && npm run copy:collection"
},
"peerDependencies": {
"@angular/common": "^7.2.0",
"@angular/core": "^7.2.0"
},
"schematics": "./schematics/collection.json",
"ng-add": {
"save": "devDependencies"
}
}
| 属性 | 说明 |
|---|---|
| build | 脚本使用自定义的 tsconfig.schematics.json 文件来编译你的原理图。 |
| copy | *语句将已编译的原理图文件复制到库的输出目录下的正确位置,以保持目录的结构。 |
| postbuild | 脚本会在 build 脚本完成后复制原理图文件。 |
修改根目录下的package.json,在scripts下加入
"build": "ng build my-lib --prod && cd ./projects/my-lib && npm run build",
"publish": "cd ./dist/my-lib && npm publish"
开始发布
npm publish
试一试ng add吧!
使用schematics修改项目
如何使用schematics修改项目中的package.json
|
方法 |
说明 |
|---|---|
| tree.overwrite() | 重新编排package.json |
| tree.read() | 读取文件内容 |
修改projects/my-lib/schematics/ng-add/index.ts
//读取angular.json的文件内容
const workspaceConfig = tree.read('angular.json');
// 如果不是 Angular 项目则抛出错误
if (!workspaceConfig) {
throw new SchematicsException('Not an Angular CLI workspace');
}
// 读取package.json的文件内容
const workspaceJson = tree.read('package.json');
let json=JSON.parse(workspaceJson)
json.script.hello="print('123')"
tree.overwrite('./package.json',JSON.stringify(json))
在node_modules添加引入与注入项
| 方法 | 说明 |
|---|---|
| addImportToModule(source: ts.SourceFile, modulePath: string, classifiedName: string, importPath: string): Change[] | 添加引入到module |
| ts.createSourFile | 创建资源文件 |
import * as ts from '@schematics/angular/third_party/github.com/Microsoft/TypeScript/lib/typescript';
import { addImportToModule } from '@schematics/angular/utility/ast-utils';
......
const modulePath = `/app.module.ts`;
const sourText = _tree.read(modulePath).toString('utf-8');
const sourceFile = ts.createSourceFile(modulePath, sourceText, ts.ScriptTarget.Latest, true);
const importPath = '@fortawesome/angular-fontawesome';
const moduleName = 'FontAwesomeModule'; //文件名为驼峰命名
const declarationChanges = addImportToModule(sourceFile, modulePath, moduleName, importPath);
const declarationRecorder = _tree.beginUpdate(modulePath);
for (const change of declarationChanges) {
if (change instanceof InsertChange) {
declarationRecorder.insertLeft(change.pos, change.toAdd);
}
}
_tree.commitUpdate(declarationRecorder);
更新文件
| 方法 | 说明 |
|---|---|
| tree.beginUpdate() | 更新内容 |
const htmlPath = `./app/src/app.component.html`;
const htmlStr = `\n\n`;
const modulePath = `/app.module.ts`;
const sourText = _tree.read(htmlPath).toString('utf-8');
const htmlSourceFile = ts.createSourceFile(htmlPath, sourceText, ts.ScriptTarget.Latest, true);
const htmlRecorder = _tree.beginUpdate(htmlPath);
htmlRecorder.insertLeft(htmlSourceFile.end, htmlStr);
_tree.commitUpdate(htmlRecorder);
package.json依赖项安装
| 方法 | 说明 |
|---|---|
| addPackageToPackageJson | 添加依赖支持 |
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
......
const dependencies = [{ name: '@fortawesome/fontawesome-svg-core', version: '~1.2.25' }],
addPackageToPackageJson(
_tree,
dependency.name, //依赖包名
dependency.version,//版本
);
ng Update使用
在collection.json 同级目录,新建 migration.json 文件,并写入以下内容:
{
"$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json",
"schematics": {
"migration002": {
"version": "0.0.2",
"description": "更新angular-schematics-tutorial到0.0.2版本时执行的更新",
"factory": "./ng-update/index#update"
}
}
}
在 package.json 中声明 ug-update 配置
在 package.json 中,添加以下项目:
"ng-update": {
"migrations": "./schematics/migration.json"
},
其作用,就是在执行 ng update 时,能够找到对应的配置文件
在projects/my-lib/schematics/ 目录下新建index.ts
import { Rule, Tree, SchematicContext, SchematicsException } from '@angular-devkit/schematics';
import { buildDefaultPath } from '@schematics/angular/utility/project';
import * as ts from 'typescript';
export function update(): Rule {
return (_tree: Tree, _context: SchematicContext) => {
// 解析angular项目
const workspaceConfigBuffer = _tree.read('angular.json');
if (!workspaceConfigBuffer) {
throw new SchematicsException('Not an Angular CLI workspace');
}
return tree.create('index.md','我更新了')
}
}
完结撒花!!
在库中使用schematics——ng add与ng update的更多相关文章
- Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...
- SharePoint 2013 文档库中PPT转换PDF
通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) ...
- 如何扫描出Android系统媒体库中视频文件
Android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息: publicstatic Lis ...
- 删除本地git版本库中受版本控制的文件
git乱码解决方案汇总 乱码原因 搜索一番,发现git文件名.log乱码,是普遍问题,这其中有编码的原因,也有跨平台的原因.主要原因是Windows 系统中的Git对中文文件名采用不同的编码保存所致 ...
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
1. HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSe ...
- 用CAS操作实现Go标准库中的Once
Go标准库中提供了Sync.Once来实现"只执行一次"的功能.学习了一下源代码,里面用的是经典的双重检查的模式: // Once is an object that will p ...
- 项目中通过Sorlj获取索引库中的数据
在开发项目中通过使用Solr所提供的Solrj(java客户端)获取索引库中的数据,这才是真正对项目起实质性作用的功能,提升平台的检索性能及检索结果的精确性 第一步,引入相关依赖的jar包 第二步,根 ...
- Git添加远程库和从远程库中获取(新手傻瓜式教学)
一. Git添加远程库 1.在本地新建一个文件夹,在该文件夹使用Git工具,运行$ git init,将该文件夹变为本地Git仓库,同时会生成一个隐藏的.git文件夹. 2.在该文件夹中用Not ...
- Git添加远程库和从远程库中获取
一. Git添加远程库 1. 在本地新建一个文件夹,在该文件夹使用Git工具,运行$ git init,将该文件夹变为本地Git仓库,同时会生成一个隐藏的.git文件夹. 2. 在该文件夹中用Note ...
随机推荐
- 简单实用的Boom 3D基础入门教程分享
Boom 3D可以很大限度的弥补声音设备或是环境的不足,满足您更加高级的声学体验.Boom 3D用简单明了的方式帮助您设计声音,即使您不是专业的声音编辑,也可以达到专业相似的效果. 打开Boom 3D ...
- PowerPoint无法正常加载MathType的解决方法
MathType是一款十分便捷的数学公式编辑器,可以和很多办公软件和网站兼容使用,我们日常用的比较多的也就是Office和WPS,更具体的说是Word\Excel\PPT等等一系列办公常用软件. 不过 ...
- guitar pro系列教程(二十三):如何使用Guitar Pro制作扫弦
前面的章节小编和大家讲解了很多关于Guitar Pro的使用功能,本章节我们将还是采用图文结合的方式和大家讲解如何使用Guitar Pro 制作扫弦,感兴趣的朋友可以进来看看哦. 扫弦的概念 对于很多 ...
- PC 端轮播图的实现
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 【模板】【P1182】数列分段II——二分答案
题意:给定一列数,分成m段,使每段和的最大值最小. 考虑二分最小段和size,答案显然满足单调性.可以在每次check中累加数列元素判断当前组的总和是否在size以内.由于序列元素均为非负整数,前缀和 ...
- 【ACwing 95】费解的开关——枚举 + 搜索
(题面来自ACwing) 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的 ...
- Mac 上超好用的代码对比工具 beyond compare,对比json差异
导读 昨天下午,公司业务跑不通,然后开发组长让架构师联系我,给我发一个json和部署到dev上的微服务url,让我去测试下,将发来的json放到json.cn上愣是解析不出来,我就用之前的json请求 ...
- Java基础教程——线程局部变量
线程局部变量 ThreadLocal,线程局部变量,不提供锁,不做线程共享,而是为每个线程提供变量的独立副本. import java.util.concurrent.*; public class ...
- django搭建完毕运行显示hello django
1.使用pycharm打开工程,进入工程配置解释器路径 2.视图和url 视图:处理我们从业务的地方,可以理解为函数 url:进行路由匹配的地方,先在主工程bookpro中进行匹配,如果匹配ok,那么 ...
- VC与VB
VB调用VC dll的返回方式 第一种类型:数值传递注意:在VB中,默认变量传递方式为ByRef为地址,而传递值就是用ByVal,还要注意在C++中,int类型的变量是32位的,在VB中要用long型 ...