###### 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` ![](https://i.imgur.com/A3teQqR.png) - 安裝 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/)