###### tags: `AWS` `CDK` `projen`
# Projen 學習
## Projen 是什麼?
與現有的 templating/scaffolding tools 相反,projen不是一次性生成器。**不應**手動編輯各項設定擋,而是編輯 projen 提供的 [.projenrc.js](https://github.com/projen/projen/blob/main/.projenrc.js) 來自動生成相關的各項設定擋。
### 優點
1. 可以在不做任何設定即生成相關專案檔案
2. 修改一個基本設定檔 [.projenrc.js](https://github.com/projen/projen/blob/main/.projenrc.js) 後下 `npx projen` 即可將設定同步至其他相關設定檔中
### 缺點
1. 文件說明較少,蠻多設定需要自己先試過後才能清楚
2. 目錄結構與 CDK 有不同,如果要轉換需要費一番功夫
### 結論
實質上 Projen 就是一個套件管理工具,可以方便開發者快速設定各項並且方便各項專案快速複製
## 相關語法
### 第一步開始專案
```
$ mkdir my-project
$ cd my-project
$ git init
$ npx projen new PROJECT-TYPE
🤖 Synthesizing project...
```
### 支援的專案類型(PROJECT-TYPE)
- [awscdk-app-ts](https://github.com/projen/projen/blob/main/API.md#projen-awscdktypescriptapp) - AWS CDK app in TypeScript.
- [awscdk-construct](https://github.com/projen/projen/blob/master/API.md#projen-awscdkconstructlibrary) - AWS CDK construct library project.
- [cdk8s-app-ts](https://github.com/projen/projen/blob/master/API.md#projen-cdk8stypescriptapp) - CDK8s app in TypeScript.
- [cdk8s-construct](https://github.com/projen/projen/blob/master/API.md#projen-constructlibrarycdk8s) - CDK8s construct library project.
- [cdktf-construct](https://github.com/projen/projen/blob/master/API.md#projen-constructlibrarycdktf) - CDKTF construct library project.
- [java](https://github.com/projen/projen/blob/master/API.md#projen-java.javaproject) - Java project.
- [jsii](https://github.com/projen/projen/blob/master/API.md#projen-jsiiproject) - Multi-language jsii library project.
- [nextjs](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjsproject) - Next.js project without TypeScript.
- [nextjs-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjstypescriptproject) - Next.js project with TypeScript.
- [node](https://github.com/projen/projen/blob/master/API.md#projen-nodeproject) - Node.js project.
- [project](https://github.com/projen/projen/blob/master/API.md#projen-project) - Base project.
- [python](https://github.com/projen/projen/blob/master/API.md#projen-python.pythonproject) - Python project.
- [react](https://github.com/projen/projen/blob/master/API.md#projen-web.reactproject) - React project without TypeScript.
- [react-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.reacttypescriptproject) - React project with TypeScript.
- [typescript](https://github.com/projen/projen/blob/master/API.md#projen-typescriptproject) - TypeScript project.
- [typescript-app](https://github.com/projen/projen/blob/master/API.md#projen-typescriptappproject) - TypeScript app.
### 基本語法
- `npx projen` 自動處理 [.projenrc.js](https://github.com/projen/projen/blob/main/.projenrc.js) 設定內容
- `npx projen build` 編譯 projen 並進行 test
- `projen projen upgrade` 更新 dependencies
- `projen projen upgrade-projen` 更新 projen
CDK 相關語法[參考](https://hackmd.io/@yuriluo/HJArsp0VO)
### .projenrc.js 重要參數說明
- `cdkVersion: '1.130.0'`: 指定 CDK 版本
- `minNodeVersion: '14'`: 指定最小 nodeJs 版本,
- `githubOptions: {workflows: false}`:
## 從舊有 CDK 專案轉移到 projen
1. 將 `package.json` 更名 `package.json.bak`
2. 將不需要的檔案刪除
- `node_modules`
- `package-lock.json`
- `yarn.lock`
3. 建立 `projen` 專案,`npx projen new PROJECT-TYPE`
4. 參考 `package.json.bak` 將套件做分類
- CDK 套件放在 `cdkDependencies`
- 其他的可以放在 deps 或 devDeps
- `cdkVersion` 可以指定,如不確定可以透過指令 `cdk version` 查看
- 若是開發 Stack 想要指定 CDK 版本,則 `cdkVersionPinning` 需要設定成 `true`
5. 將原先的 CDK 主程式移到 `src` 目錄下
- 因 `projen` 主程式進入點為 `main.ts` 推薦可以將程式拆分比較好區隔
- 執行 `npx projen build ` compile 後的檔案會放到 `lib` 資料夾
6. 執行 `npx projen` 會自動安裝 [.projenrc.js](https://github.com/projen/projen/blob/main/.projenrc.js) 設定好的套件與生成相關設定檔
7. 確認生成的 `package.json` 與之前的設定差不多後即可移除 `package.json.bak`
## 開發時的 Q&A
1. projen CDK 版本過舊問題
```
***************************************************
*** Newer version of CDK is available [1.110.1] ***
*** Upgrade recommended ***
***************************************************
```
可以更新 [.projenrc.js](https://github.com/projen/projen/blob/main/.projenrc.js) 中的 `cdkVersion` 來處理
2. 調整 `cdkVersion` 後執行 `cdk deploy` 時的錯誤
```
This CDK CLI is not compatible with the CDK library used by your application. Please upgrade the CLI to the latest version.
(Cloud assembly schema version mismatch: Maximum schema version supported is 9.0.0, but found 12.0.0)
```
可透過更新本機 CDK library 來處理
```
npm install -g aws-cdk
```
3. 非 src 資料夾該怎麼 Compile
- 需先安裝 `Node.js`
- 執行 `npm init` 初始化一個 `package.json`

- 安裝 TypeScript 以及讓 Node.js 支援型別的套件
`npm install typescript @types/node`
- 初始化 tsconfig (TypeScript 的設定檔)
`npx tsc --init`
- 目錄下即會產生 `package.json`、`package-lock.json`、`typescript.json`
- 如你需要設定編譯後的檔案在特定的資料夾可以參考以下步驟處理
- 開啟 `tsconfig.json`
- 找到 `outDir`(Output directory) 後將其移除註解並改成 `./dist`(亦可改成其他資料夾)
- 最後執行 `tsc`,編譯後的檔案就會出現在你指定的資料夾中了
## 參考資料
[projen repo](https://github.com/projen/projen)
[Projen 初探 – 打造 CDK 的利器](https://9incloud.com/aws/cdk/projen-cdk)
[pahud dev youtube](https://www.youtube.com/watch?v=vMybA3kdBU0)
[UPDATE CDK TO THE LATEST VERSION](https://dotnet-app-modernization.workshop.aws/1-cdk-101/update-cdk.html)
[【TypeScript】從頭建立屬於你的 TypeScript 專案](https://nijialin.com/2020/09/19/how-to-build-typescript/)