![](/img/trans.png)
[英]How to deploy TypeScript/Node.js service with Yarn 1 and workspaces?
[英]How to use yarn workspaces with typescript and out folders?
我正在嘗試使用紗線建立一個monorepo。 我對如何使用項目引用設置打字稿感到困惑,以便正確解決問題。
例如,如果我有一個類似的文件夾結構
/cmd
/client
我希望cmd
依賴於我可能擁有的client
:
cmd/tsconfig.json
:
{
"compilerOptions": {
"types": ["reflect-metadata", "jest"],
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": "node",
"declaration": true,
"importHelpers": true,
"composite": true,
"target": "esnext"
"sourceRoot": "src",
"outDir": "dist"
},
"references": [
{
"path": "../client"
}
],
"include": [
"src/**/*"
]
}
與package.json
{
"name": "cmd",
"version": "1.0.0",
"dependencies": {
"client": "^1.0.0",
}
}
在此模型中, cmd
和client
都使用在outDir
設置的outDir
和sourceRoot
字段進行編譯。 這意味着他們所有已編譯的javascript都將進入cmd/dist
和client/dist
的dist/
子文件夾
如果現在我嘗試從client
將類引用到cmd
import Foo from 'client/src/foo'
IDE非常樂意解決此問題,因為它似乎是通過typescript references
屬性映射的。
但是,已編譯的javascript歸結為
const foo_1 = require("client/src/foo");
但是,實際構建的javascript在client/dist/src/foo
,因此在運行時這永遠無法工作。
另一方面,如果我不使用sourceRoots和outDirs並將javascript與Typescript文件內聯在同一文件夾中,則一切正常(但使存儲庫變臟並需要自定義gitignores來排除事物)
任何人都無法闡明如何正確設置帶有紗線工作區的Typescript 3.x monorepo,從而使工作正常進行嗎?
我創建了一個Github 存儲庫 ,以使其更容易遵循以下代碼描述:
使用TypeScript Project References
可以編譯由多個較小的TypeScript項目組成的TypeScript項目,每個項目都有一個tsconfig.json
文件。 (來源: 項目參考文檔 )
我們有一個tsconfig.json
根文件,該文件僅管理其子項目。 references
屬性指定目錄,每個目錄均包含有效的tsconfig.json
文件。 如果現在使用--build
選項( tsc --build tsconfig.json
)來構建項目,則我們指定了應編譯的項目,但未指定項目的編譯順序 。
{
"references": [
{ "path": "./client" },
{ "path": "./cmd" }
],
"files": [],
"include": [],
"exclude": ["**/node_modules"]
}
為了正確地指定構建順序,我們需要在cmd/tsconfig.json
文件中添加references
屬性。 這告訴編譯器在編譯cmd/
之前首先需要編譯client/
cmd/
:
cmd/tsconfig.json
:
{
"extends": "../tsconfig.packages.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "dist"
},
"references": [
{
"path": "../client"
}
]
}
建立訂單
client/
^
|
|
cmd/
最佳實踐是每個子項目都有自己的package.json
文件,其中包含main
屬性和name
集。 在我們的示例中,兩個軟件包( cmd/
和client/
)都有一個main
屬性,指向TypeScript outDir
目錄( cmd/dist/index.js
和client/dist/index.js
)中的index.js
文件。
項目結構:
tsconfig.json
cmd/
tsconfig.json
package.json
src/
index.ts
dist/ #artifacts
index.js
client/
tsconfig.json
package.json
src/
index.ts
dist/ #artifacts
index.js
client/packages.json
{
"name": "client",
"version": "1.0.0",
"main": "dist/index",
...
}
重要的是,將client/
作為依賴項添加到cmd/packages.json
以便模塊解析算法在將TypeScript代碼中的“ client/dist/index.js
import Foo from 'client';
時可以找到client/dist/index.js
import Foo from 'client';
:
cmd/packages.json
{
"name": "cmd",
"version": "1.0.0",
"main": "dist/index",
"dependencies": {
"client": "1.0.0" // important
}
}
cmd/src/index.ts
import Foo from 'client';
console.log(Foo())
紗線設置簡單。 Yarn將所有軟件包添加到node_modules
下,而不是:
cmd/node_modules
client/node_modules
要啟用紗線工作區,請將workspaces
屬性和private: true
屬性添加到<root>/package.json
文件。
<root>/package.json
{
"private": true,
"workspaces": [
"cmd",
"client"
],
"name": "yarn_workplace",
"version": "1.0.0"
...
}
的cmd/
和client/
包symlinked
的下<root>/node_modules/
目錄:
cmd/
包使用定義文件client/dist/index.d.ts
作為類型信息,而不是直接使用TypeScript文件。 我已經使用此存儲庫中的 Yarn Workspaces和Typescript在我的項目中使用了一些配置,從而設置了monorepo。
我不知道此設置是否可以解決您的問題,但是您無需在Typescript配置中指定軟件包。 當您使用Yarn Workspaces時,它將在根package.json
中的工作空間包屬性中定義的根node_modules
中鏈接所有package.json
:
"workspaces": {
"packages": [
"packages/**/*"
],
"nohoist": []
}
在yarn install
之后,根節點node_modules
將client
和cmd
作為鏈接文件夾。
使用此配置,您可以簡單地導入工作區中任何包中的任何包。 例如:
// cmd/src/index.ts
import { name } from 'client';
const otherName = 'cmd' + name;
console.log(otherName);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.