我有一个包含许多微服务的 monorepo。我想让任何需要它的微服务都可以使用一些库类型的函数/类。但是,如果该库包声明了对等依赖项,则在从依赖于该库的事物中运行代码时将找不到对等依赖项。
考虑这个回购结构:
foo
)
foo
)foo
, 和some-library
)
some-library
)foo
some-library
将是一个符号链接 ../../lib/some-library
运行时node services/some-service/index.js
,您将收到错误“无法找到模块 'foo'”,来自lib/some-library/index.js
.
可能发生这种情况是因为节点只查看祖先目录中的lib/some-library/node_modules
任何node_modules
文件夹。但是由于此代码是从services/some-service
(作为工作目录)运行的,并且由于 中的符号链接services/some-service/node_modules
,我希望它可以工作。
这是一个您可以轻松克隆以查看问题的存储库:https : //github.com/jthomerson/example-local-dependency-problem
git clone git@github.com:jthomerson/example-local-dependency-problem.git
cd example-local-dependency-problem
cd services/some-service
npm install
node index.js
Run Code Online (Sandbox Code Playgroud)
我只看到两种解决方案:
这些都不是一个真正好的解决方案,因为它不允许每个服务具有不同版本的依赖项,因此意味着如果依赖项的本地版本(或库的版本)被碰撞,所有使用该库的服务然后让它们的依赖版本同时发生碰撞,这使得它们更加脆弱,因为它们都被捆绑在一起。
为公司内部使用的项目设置 git repo 的最佳方法是什么,但您也想开源(但可能会修改历史)?
假设 Acme 公司有一个回购“supercoolproject”。他们想要开源它,但他们实际上根本不想要与它相关联的公司名称。他们以开发人员的名字(或组等)设置了一个 GitHub 帐户,并创建了存储库。他们将其克隆到内部 Acme 服务器。没有提到“Acme”。
现在问题来了——在任何给定的组织中,都有了解开源并被授权将一些代码公开的开发人员。还有其他人不了解所有细微差别。当其中之一进行提交时,可能会包含公司名称或其他一些专有信息。或者,他们只是做了一个可以在内部恢复的可怕的提交(不是重写历史——我只是在谈论添加一个“恢复”提交)。但是,您不希望这些专有提交进入开源分支。
因此,您创建了“acme_internal_{dev,qa,production}”分支和一个外部“master”分支(也可能是其他分支)。保持这些同步的最佳方法是什么?您希望接受对开源存储库的提交。并且您想推送(大部分)您的内部提交。但是有一些是不应该出去的。
似乎合并 internal -> external 是一件坏事,因为您无法删除错误的提交。可以在内部分支上重新设置外部分支,但似乎一旦您“git rebase -i acme/acme_internal_dev”一次并修改历史记录(更改提交消息、删除提交等),您就不能再重新设置基准,因为两个历史背道而驰。那么,您是否最终将所有内部提交都挑选到公共分支,然后将公共分支合并到内部树中?这看起来也很丑陋,因为您最终会在内部重复提交(原始提交,然后是精心挑选的进入外部并合并回内部的提交)。
出于这个问题的目的,让我们假设 Acme 在内部希望避免在其内部分支上重写历史记录(实际上是删除/修改错误提交)。
我有一个图表,代表一个由两个较小的流程组成的大型流程.每个较小的过程由子图表示.但是当我将其中一个子进程的末尾(比如说"一个")连接到另一个进程的开头("两个")时,另一个进程("两个")的起始形状最终会在与结束"一".如何从一个箭头指向箭头指向两个开头,但是在其簇中保持两个的起始形状?
digraph BigProcess {
graph [ label="Some big process" ]
subgraph clusterSubProcess1 {
graph [ label="Subprocess one", color="red" ]
start1_1 -> start1_2;
start1_2 -> start1_3a;
start1_2 -> start1_3b;
start1_3a -> start1_4;
start1_3b -> start1_5;
start1_4 -> start1_1;
start1_5 -> start2_1;
}
subgraph clusterSubProcess2 {
graph [ label="Subprocess two", color="blue" ]
start2_1 -> start2_2;
start2_2 -> start2_3a;
start2_2 -> start2_3b;
start2_3a -> start2_4;
start2_3b -> start2_5;
start2_4 -> start2_1;
start2_5 -> end1;
}
}
Run Code Online (Sandbox Code Playgroud)
这导致以下结果,我真的希望start2_1成为蓝色有界框内的顶级节点.
我有一个对象,提供一种资产版本的审核日志。它的几个属性(versionSource.metadata
和versionSource.files
)是应根据两个架构之一验证的对象,具体取决于其架构之一的值。我开始在子方案中使用一个常量(在中oneOf
,但那是说所有子方案都已验证(因此打破了oneOf
多个已验证的方案。不过,将其更改为单值枚举是可行的)。
为什么验证有所不同?
这是原始架构:
{
"$id": "https://example.com/schemas/asset-version.json",
"title": "Audit log of asset versions",
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",
"required": [
"assetID",
"version",
"versionSource"
],
"properties": {
"assetID": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"versionSource": {
"type": "object",
"properties": {
"metadata": {
"type": "object",
"oneOf": [
{
"properties": {
"sourceType": { "constant": "client" }
}
},
{
"$ref": "#/definitions/version-source-previous-version"
}
]
},
"files": {
"type": "object",
"oneOf": [
{
"properties": …
Run Code Online (Sandbox Code Playgroud) digraphs ×1
dot ×1
git ×1
git-rebase ×1
graphviz ×1
json ×1
jsonschema ×1
merge ×1
monorepo ×1
node.js ×1
npm ×1
open-source ×1
rebase ×1