创建一个名为my-workspace
【名字自取】的工作区
# --create-application=false 表示创建的不是一个应用程序
ng new my-workspace --create-application=false
进入到my-workspce
工作区下,向工作区中增加一个 my-lib
【名字自取】的库
ng generate library my-lib
要在本地使用我们创建的库,还需要创建一个angualr
项目
ng new my-project
打包创建的my-lib
库
# 在·my-workspace·根目录下执行
npm run build
打包完成后,会在dist
目录下看到打包后的my-lib
进入到 dist/my-lib
下,执行:
npm link
# 执行完成后,会提示我们:
# C:\Program Files\nodejs\node_modules\my-lib -> xxxx\my-workspace\dist\my-lib
# 此时我们去到 C:\Program Files\nodejs\node_modules 下,就可以看到我们的打包的 my-lib 已经被连接了这里。
此时,在回到我们生成的 my-project
根目录下
npm link my-lib
# 取消连接,执行:npm unlink my-lib
# 执行完毕后,会展示:
# xxx\my-project\node_modules\my-lib -> C:\Program Files\nodejs\node_modules\my-lib -> xxx\my-workspace\dist\my-lib
# 这其实就是展示了我们 link 进来的 my-lib 的源在哪里。
到此为止,我们就可以使用我们的 my-lib
库了,例如:
// 在 my-project 的 app.modules.ts 文件中,引入我们的 MyLibModule
import { MyLibModule } from 'my-lib';
// 导入一下
imports: [
MyLibModule
]
// 在 app.component.html 下
<lib-my-lib> </lib-my-lib>
运行my-project
项目,我们就可以看到效果:
页面上多了一行 my-lib works
注意:下面的
watch
执行,是建立在npm link
之后,即,我们必须要手动的把我们打的包npm link
之后,再去执行下面的步骤。毕竟,
watch
只是监听代码改动并重新打包,并不会帮我们npm link
。所以这点一定要注意。
watch
的作用就是营造热加载的效果,不然我们每次改变library
就需要重新打包,重新 link
,着实麻烦。
接下就说一下如何使用这个 watch
创建library
的方法是不变的。变的是library
的打包:
# 在 my-worksapce 目录下,就不执行 npm run build 了,执行:
npm run watch
# 执行完我们就会发现, library 提示我们:
# Compilation complete. Watching for file changes...
然后下面,就直接可以去我们创建的my-project
项目下,执行:npm link my-lib
即可。
此时再去改动我们的library
,就会发现,library
自动帮我们重新打包,并且,my-project
也会自动应用最新的 my-lib
的改变。
错误原因:
@NgModule()
从不同node_modules
位置解析时会发生这种情况。ivy
副本。 这是由于 TypeScript 的模块解析方法 - 它node_modules
通过遍历正在编译的文件目录来查找。解决方案:
在angular.json
中添加以下代码:preserveSymlinks:false
。
// 具体位置如下:
project: {
projectName: {
architect: {
build: {
options: {
"preserveSymlinks":false
}
}
}
}
}
在自己本地测试所写的没问题之后,就可进入打包发布流程。
默认已存在一个注册的 npm 账号,若无,则去注册一个。
发布的流程大致分为以下几步:
配置自己发布的信息,在package.json`中,例如下面这样:
{
"name": "syw-electron-titlebar",
"version": "1.0.2",
"description": "This is a angualrcli based custom electron titlebar.",
"keywords": ["Angular", "Electron", "Titlebar"],
"repository": {
"type": "git",
"url": "https://github.com/YouWillSun/syw-electron-titlebar"
},
"homepage": "https://github.com/YouWillSun/syw-electron-titlebar",
"peerDependencies": {
"@angular/common": "^12.2.0",
"@angular/core": "^12.2.0",
},
"dependencies": {
"tslib": "^2.3.0"
}
}
name
这个将会是发布后的NPM包名,所以,要保证唯一性,即在NPM上不存在同样的名称。
version
版本号,注意版本号最好别搞个 0.0.0
,这是不好的
projects
库下面。projects/xxx/package.json
配置的版本号没用,直接是根据项目根目录下的package.json
的版本号里来的,所以这里要注意一下。description
包的描述keywords
关键词,配置关键词,发布后会在NPM上展示。repository
仓库,上面配置的是 git 仓库。homepage
主页面,一把是官网地址等等,如果有的话。还有就是注意修改库目录下的README
文件,此文件将会是包发布后对外展示用法或版本或依赖的说明文件,要搞好,不然别人下了你的库,也不知道咋用。
在项目根目录下[不是库目录,是项目根目录],执行打包命令。
npm run build
默认情况下,打包后输出的位置都是在dist/xxxx
下。
进入到dist/xxxx
执行npm
打包命令。
npm pack
这个命令是将打包后的程序打包成一个.tgz
的压缩包,而第二步的打包时打包我们的应用程序,两者不可混淆。
命令行登录NPM
npm login
# 根据提示输入自己的信息
验证自己是否登录成功,可使用命令
npm whoami
退出登录,则使用
npm logout
登录成功后,执行发布命令,发布的是我们刚才第三步执行生成的.tgz
包
npm publish xxxxx.tgz
要注意一下自己此时所在的位置,若此时在打包后的dist项目录下,当然可以直接写文件名
若是不在,则可以将名称替换为路径,如:
npm publish ./dist/xxxxx.tgz
到此位置,我们就可以在NPM上看到自己发布的包了。
对于已发布的NPM包的更新,其实流程和发布差不多,项目打包 --> npm打包 —> 发布。
要注意的最大的问题就是 **版本号
**问题,因为新发布版本的版本号不能和线上的一样。
版本号可以自己定义,这个没啥说的,改package.json
就行。
也可以使用 npm 官方提供的版本控制,而且更具语义化:
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]
啥意思呢:
major
:主版本号(大版本)minor
:次版本号(小更新)patch
:补丁号(补丁)premajor
:预备主版本preminor
: 预备次版本prepatch
:预备补丁版本prerelease
:预发布版本比如你的初始版本是 1.0.0
,你修改了一些bug,发布新版本时,你就可以执行:
npm version patch
# 此时,你的版本号就会改为 1.0.1
再比如,你加了一些功能,你就可以执行:
npm version minor
# 此时你的版本号就会改为 1.1.0
其他的不变,进行正常的发布即可。
OK,说了重要发发布和更新,还有其他一些知识点,比如:撤销发布,推荐大家看两遍文章,写的挺好:
npm version minor
# 此时你的版本号就会改为 1.1.0
其他的不变,进行正常的发布即可。
OK,说了重要发发布和更新,还有其他一些知识点,比如:撤销发布,推荐大家看两遍文章,写的挺好: