如何像VisualStudio项目那样开发/构建Javascript monorepo项目?

如何像VisualStudio项目那样开发/构建Javascript monorepo项目?,javascript,node.js,npm,yarnpkg,package.json,Javascript,Node.js,Npm,Yarnpkg,Package.json,在一个典型的.NET核心项目(Visual Studio 2019)中,我们的结构如下: Example/ |-- Example.Common/ | |-- FileExample1.cs | |-- FileExample2.cs | `-- Example.Common.csproj |-- Example.WebAPI/ | |-- Controllers/ | |-- Program.cs | |-- Startup.cs | `-- Example.Web

在一个典型的.NET核心项目(Visual Studio 2019)中,我们的结构如下:

Example/
|-- Example.Common/
|   |-- FileExample1.cs
|   |-- FileExample2.cs
|   `-- Example.Common.csproj
|-- Example.WebAPI/
|   |-- Controllers/
|   |-- Program.cs
|   |-- Startup.cs
|   `-- Example.WebAPI.csproj
|-- Example.CLI/
|   |-- Program.cs
|   `-- Example.CLI.csproj
|-- Example.sln
在这个项目中,
Example.CLI
Example.Web.API
都引用了
Example.Common
项目。
Example.sln
文件引用了所有三个
*.csproj
,每个csproj都有自己的依赖项,可以是以下四种依赖项之一:


路径/to/Local.Dependency.Example.dll
在开发过程中运行本地时,如果我更改了公共源代码中的某些内容并运行CLI项目,它会自动重建公共代码并将DLL复制到目标,以便CLI可以运行具有这些最新更改的版本。即使解决方案中有更多项目,它也只会重建CLI所依赖的项目,以及自上次运行以来是否有任何更改

在部署时,它将重建所有内容并在本地解决本地依赖关系。我对Node.js和NPM包的问题是:

  • 当本地开发变得容易时,就很难部署和生成docker映像
  • 当部署和生成docker映像变得容易时,本地开发就会变得困难
我想在Node.js项目中做同样的事情,共享
common
源代码以用于
webapi
cli
,并且我想在npm包中分解项目的每个组件,这样每个包都可以有自己的依赖项

在Node.js项目中,我有一个类似的结构:

example/
|-- common/
|   |-- file-example1.js
|   |-- file-example2.js
|   `-- package.json
|-- web-api/
|   |-- controllers/
|   |-- index.js
|   |-- routes.js
|   `-- package.json
|-- cli/
|   |-- index.js
|   `-- package.json
|-- package.json
问题在于Node.js和npm/warn/pnpm如何解决依赖关系。我尝试使用Thread工作区、Lerna、Lerna+Thread工作区,但似乎所有这些工具都是为发布到注册中心的包而设计的,而不是为了帮助模块化单个项目

我想要的是一种简单的方法:

  • 在开发本地时,对通用源代码进行更改,并使用更新的通用版本运行web api或cli,无需每次调用
    warn install
    ,也无需手动创建
    npm link
  • 部署时,使用本地源代码/构建解析依赖项,并按正确顺序构建
我试过:

  • 纱线
    链接:
    协议,对开发很有用,但当我运行
    纱线安装--生产时
    它会尝试使用注册表进行解析。不会工作,因为我的任何包都不会发布到任何注册表
  • NPM
    文件:
    协议,适用于部署,但对于开发,当我在公共包中进行更改时,我需要删除节点模块中的公共文件夹并再次运行
    纱线安装
    。即使使用
    file:
    protocol,我仍然需要一种按正确顺序构建的方法,否则,npm/Thread只会将依赖项的源代码复制到目标节点\u modules文件夹

简短回答:

lerna bootstrap
lerna run dev
bootstrap
将为相应的软件包安装依赖项。 示例:
common
应安装在
webapi
中。 Lerna将在
WebAPI
中安装
common
,作为
节点模块

package.json
中添加
private:true
也将确保lerna publish不会发布这些项目


(长答案:)

给定文件夹目录

example/
|-- common/
|   |-- file-example1.js
|   |-- file-example2.js
|   `-- package.json
|-- web-api/
|   |-- controllers/
|   |-- index.js
|   |-- routes.js
|   `-- package.json
|-- package.json

1。纱线工作区

示例/package.json

{
  "private": true,
  "workspaces": ["common", "web-api"]
}
{
  "name": "common",
  "version": 1.0.0
  ...
}
{
  "name" "web-api",
  "dependencies": {
    "common": "1.0.0"
  }
}
在相应的子文件夹中初始化纱线

终端

~/example$cd./common
~/example/common$warn init-y
~/example/common$cd../web api
~/example/webapi$thread init-y
在示例/common/package.json中

{
  "private": true,
  "workspaces": ["common", "web-api"]
}
{
  "name": "common",
  "version": 1.0.0
  ...
}
{
  "name" "web-api",
  "dependencies": {
    "common": "1.0.0"
  }
}
在示例/web api/package.json中

{
  "private": true,
  "workspaces": ["common", "web-api"]
}
{
  "name": "common",
  "version": 1.0.0
  ...
}
{
  "name" "web-api",
  "dependencies": {
    "common": "1.0.0"
  }
}
终端(在web api目录中时)

~/example/webapi$thread安装
在根目录中应该有一个
节点\u modules
,它应该包括:

web-api/
common/
warn
将在根级别创建的node_modules文件夹中的
common
webapi
之间创建符号链接

然而,
yarnpkg
惯例是使用

{
  "private": true,
  "workspaces": ["packages/"]
}
参考:


2。勒纳

Lerna在引擎盖下使用Thread工作区,但您需要
Lerna.json
config(可以指定您需要的包管理器npm,Thread…)

lerna.json

{
  "packages": [
    "packages/*"
  ],
  "version": "0.0.0"
}

lerna中有额外的命令,例如:
-
lerna diff common
它将为您提供自上次提交以来的git diff,或。 -
lerna运行测试
,它将在每个包中运行
测试
脚本。(使用
--scope={common}
仅针对
公共测试
脚本)

在中,它们还包括一个“changelog”字段,我假设该字段会自动为提交消息添加前缀

参考: