在根工作区中提供时在 bazel 工作区中引用 angular.json 不是一个选项
Referring angular.json in bazel workspace when supplying it in the root workspace is not an option
我正在尝试将 Angular 项目集成到现有的 Bazel 构建系统中。当我尝试 运行 angular 构建时,出现以下错误。
Workspace configuration file (angular.json, .angular.json, workspace.json, .workspace.json) cannot be found in '/home/build/.cache/bazel/_bazel_build/46b74a3c1f9a666f55591a5719d9f2ba/sandbox/linux-sandbox/1/execroot/root' or in parent directories.
现在我的 angular 项目位于根工作区的子文件夹中,因此 angular 无法找到 angular json 文件。当我 运行 angular 使用 angular devkit 的架构包构建时,也没有选项可以使用 args 指定 angular json 的确切位置,这可能有潜在的解决了问题。
一种方法,我能想到的解决方法是在 运行 构建命令之前将 angular json 文件复制到工作空间的根目录。我可以尝试其他选择吗?
您可以使用chdir
您基本上会将路径传递给该子文件夹,并且该工具将在 运行 ng 构建之前更改为该目录。我还必须通过将级别向上移动到根目录来更改 outDir 才能成功构建。
例如,如果 chdir 是 lib/sub/angular 那么 outDir 就是 ../../../$ (@D)
Birju 的回答很准确。但我觉得它值得一些代码。
我还要补充一下,使用chdir
后设置输出目录是真的重要的,否则你会挠头因为构建声称成功,但是当你检查你的 bazel 输出时,什么也不会出现(某种无声的失败)。请注意,在我的示例中,它是 outputPath
但此变量实际上取决于您使用的工具,而不是 Bazel 本身。
foo/BUILD.bazel
load("@npm//@angular-devkit/architect-cli:index.bzl", "architect") # architect ruleset being generated by bazel itself. (I.e. `foo/`)
architect(
name = "build",
args = [
"frontend:build",
"--outputPath=../$(@D)", # This output argument needs to point to the wherever the workspace directory is. Otherwise, your bazel build will succeed but nothing will appear.
],
chdir = package_name(), # package_name() gets the path of wherever the current build file is
# any other arguments...
)
以防有人试图使用不允许 outputPath
的架构师构建 Angular 库。我关注了 this example.
其中,chdir = package_name(),
行绝对是必需的,正如@Cameron @Birju 所说。代码中的args $(@D)
需要改到正确的位置。否则,它位于沙箱中,将被删除。
在示例中,一切运行良好。但就我而言,我的 GUI 项目在 WORKSPACE
目录的 subdir1/subdir2
中,而我的库在 subdir1/subdir2/projects/mylib
中。我没有示例中的 .bazelrc
文件。所以我最终不得不更改 ${@D}
以添加很多 ../
以便离开沙箱目录,例如“../../../../../ ../../../../execroot/bla/$(@D)"
我正在尝试将 Angular 项目集成到现有的 Bazel 构建系统中。当我尝试 运行 angular 构建时,出现以下错误。
Workspace configuration file (angular.json, .angular.json, workspace.json, .workspace.json) cannot be found in '/home/build/.cache/bazel/_bazel_build/46b74a3c1f9a666f55591a5719d9f2ba/sandbox/linux-sandbox/1/execroot/root' or in parent directories.
现在我的 angular 项目位于根工作区的子文件夹中,因此 angular 无法找到 angular json 文件。当我 运行 angular 使用 angular devkit 的架构包构建时,也没有选项可以使用 args 指定 angular json 的确切位置,这可能有潜在的解决了问题。
一种方法,我能想到的解决方法是在 运行 构建命令之前将 angular json 文件复制到工作空间的根目录。我可以尝试其他选择吗?
您可以使用chdir
您基本上会将路径传递给该子文件夹,并且该工具将在 运行 ng 构建之前更改为该目录。我还必须通过将级别向上移动到根目录来更改 outDir 才能成功构建。
例如,如果 chdir 是 lib/sub/angular 那么 outDir 就是 ../../../$ (@D)
Birju 的回答很准确。但我觉得它值得一些代码。
我还要补充一下,使用chdir
后设置输出目录是真的重要的,否则你会挠头因为构建声称成功,但是当你检查你的 bazel 输出时,什么也不会出现(某种无声的失败)。请注意,在我的示例中,它是 outputPath
但此变量实际上取决于您使用的工具,而不是 Bazel 本身。
foo/BUILD.bazel
load("@npm//@angular-devkit/architect-cli:index.bzl", "architect") # architect ruleset being generated by bazel itself. (I.e. `foo/`)
architect(
name = "build",
args = [
"frontend:build",
"--outputPath=../$(@D)", # This output argument needs to point to the wherever the workspace directory is. Otherwise, your bazel build will succeed but nothing will appear.
],
chdir = package_name(), # package_name() gets the path of wherever the current build file is
# any other arguments...
)
以防有人试图使用不允许 outputPath
的架构师构建 Angular 库。我关注了 this example.
其中,chdir = package_name(),
行绝对是必需的,正如@Cameron @Birju 所说。代码中的args $(@D)
需要改到正确的位置。否则,它位于沙箱中,将被删除。
在示例中,一切运行良好。但就我而言,我的 GUI 项目在 WORKSPACE
目录的 subdir1/subdir2
中,而我的库在 subdir1/subdir2/projects/mylib
中。我没有示例中的 .bazelrc
文件。所以我最终不得不更改 ${@D}
以添加很多 ../
以便离开沙箱目录,例如“../../../../../ ../../../../execroot/bla/$(@D)"