首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Bazel说没有定义像“规则”这样的全局变量?

Bazel是一种用于构建和测试软件项目的开源工具,它使用一种称为“构建规则”的概念来定义如何从源代码生成可执行文件或其他构建产物。当Bazel报告没有定义像“规则”这样的全局变量时,通常是因为以下几个原因:

原因分析:

  1. 规则未声明
    • 在Bazel的BUILD文件中,你需要明确声明规则。如果缺少规则的声明,Bazel将无法识别它。
  • 作用域问题
    • 在某些情况下,变量可能被声明在错误的作用域内,导致它们在需要的地方不可见。
  • 拼写错误
    • 变量名拼写错误也会导致Bazel无法找到相应的定义。
  • 依赖问题
    • 如果规则依赖于其他文件或模块,而这些文件或模块中的规则未正确定义或导入,也会导致此问题。

解决方法:

  1. 检查规则声明
    • 确保在BUILD文件中正确声明了所需的规则。例如:
    • 确保在BUILD文件中正确声明了所需的规则。例如:
  • 检查作用域
    • 确保变量在正确的作用域内声明。例如,如果你在一个函数内部声明了一个变量,它只能在该函数内部访问。
  • 检查拼写
    • 仔细检查变量名的拼写,确保没有拼写错误。
  • 检查依赖
    • 确保所有依赖的文件和模块中的规则都已正确定义,并且正确导入了这些依赖。

示例代码:

假设你有一个BUILD文件如下:

代码语言:txt
复制
cc_library(
    name = "my_library",
    srcs = ["my_library.cc"],
    hdrs = ["my_library.h"],
)

# 错误的规则声明
cc_binary(
    name = "my_binary",
    srcs = ["main.cc"],
    deps = [":my_library"],
    # 这里缺少了rules的声明
)

正确的做法是确保所有规则都正确声明:

代码语言:txt
复制
cc_library(
    name = "my_library",
    srcs = ["my_library.cc"],
    hdrs = ["my_library.h"],
)

cc_binary(
    name = "my_binary",
    srcs = ["main.cc"],
    deps = [":my_library"],
)

参考链接:

通过以上步骤,你应该能够解决Bazel报告没有定义像“规则”这样的全局变量的问题。

相关搜索:为什么它说我的组件没有定义?为什么HTML说我的变量没有定义?为什么.NET没有像Java这样的内置Observer模式?为什么我的laravel说symlink -没有这样的文件或目录有没有像“显式函数返回类型”这样不需要void类型的规则?为什么R引入NA?没有逗号,只有像4438这样的普通数字为什么我的类在这样导出的时候没有定义?为什么VB.NET 9没有像C#3这样的自动属性?为什么没有像MediaType.APPLICATION_XML_UTF8这样的Spring MediaType呢?为什么像Java这样的语言使用分层包名,而Python却没有?在代码触发器中有没有像$_REQUEST这样的相同的预定义变量?在react中为什么错误是这样显示的--> 'customerSignup‘没有定义Kotlin Ranges:为什么没有像`until`这样的‘downTo`变量来排除最后一项?当我在for循环外部引用'line‘时,为什么我的代码说没有定义它?为什么安卓要运行像"onItemSelected“这样的方法,即使它们没有在oncreate方法中被调用?为什么在HTML类元素的for循环中,像i,j,k这样的变量显示未定义?为什么我的不一致机器人代码说有些东西没有定义,而它是定义的?如何使用#react-admin创建自定义页面,而没有像登录页面这样的菜单侧边栏?为什么它说myPair类没有out的成员?当我在类中定义函数时,它工作得很好为什么我要获取标识符'X‘没有定义。'T‘在typscript 3.4.3中不包含这样的memberAngular吗?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何挖掘 Bazel 极致性能

Bazel 为什么如此受欢迎,原因正如它宣传: "Correct & Fast, Choose Two",这并不是一句口号,从实际用户体验也能看出。...Bazel 官方定义了一些规则 (rule),用于构建某些特定产物,例如 c++ library 或者 go 语言 package,用户配置和调用这些规则。...他仅仅需要告诉 Bazel 要构建什么 Artifact,而由 Bazel 来决定如何构建它。 规则由官方和可信赖第三方维护,规则产生任务,满足封闭性需求,这使得用户可以信赖系统增量构建能力。...要想得到稳定结果,就需要定义这两个 Task 之间依赖关系。 Bazel Action 由构建系统本身设计,更加安全,也不会出现类似的竞争问题。...Bazel 在设计时非常注重“增量”,“缓存”和“并行”,这是高性能 基础。而 Bazel 官方推出并维护了不同语言构建规则,也保证了构建过程时封闭,可靠,这是高性能 前提。

63720

定义工具链

因此非平台方式(Non-Platform)定义工具链实现并没有统一 APIs 来规范不同语言跨平台构建。而 Bazel 目标是在大型、混合语言、多平台项目中脱颖而出。...如果没有去了解 Platform 和 Non-Platform 方式区别,可能会对上面内容有点不理解,这里通俗来讲下这两者区别。...“注:这里 Host 平台只是平台扮演一个角色阐述,跟实际编写 Bazel 规则没有关系。toolchain 规则里也只有对执行平台和目标平台约束设置。...3.1.2 定义约束和平台 平台可能选择空间是通过使用构建文件中 constraint_setting 和 constraint_value 规则定义。...这样就可以将平台与工具链联合在一起了,原理类似依赖注入。 工具链是使用 toolchain[2] 规则定义目标,该规则将工具链实现与工具链类型相关联。

4.6K31
  • 定义命令行编译标志

    1 名词 名词 释义 aspect 将自定义行为附加到规则逻辑包。这与配置相似,但不同是 aspect 不会更改原始规则。...没有附带标志构建设置对用户不可见。规则设计者可以利用它,例如使规则在其依赖项上设置隐式属性。 transition 表示跨依赖项边缘配置转换。即可以实现读入一组构建设置,并输出一组构建设置。...当然,简单,我们可以定义构建设置,只限制值类型,而不限制值内容。 构建设置相关规则跟其他规则定义差不多,区别就是看有没有 build_setting 属性。...当然,如果你定义 week 目标(构建设置)时候,不设置 values 属性,则对命令行传入没有限制。 注意:传递自定义命令行参数时 -- 是紧跟构建设置目标的。...5 自定义规则绑定自定义构建设置 比如我们定义了一个 date 规则,我们在构建 date 目标时,希望能够在命令行获取 week 参数,则我们需要在 date 规则实现中能够获取 week 配置值

    2.5K40

    定义规则实现将多个静态库合并为一个动态库或静态库

    1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述将多个静态库合并为一个动态库,内置 Bazel...规则没有这个功能Bazel C/C++ 相关内置规则有: cc_binary :生成可执行文件 cc_import :允许用户导入预编译 C/C++ 库,包括动态库、静态库 cc_library...:表示 C++ 工具链集合 而我们知道规则(Rule)定义Bazel 对输入执行一系列操作,以生成一组输出。...另外我们还需要传入 gcc 将多个静态库合并成一个动态库相关参数、待合成静态库列表、最后要生成动态库名称和路径。这样就是一个比较完善定义规则了。...最后在实现自定义规则中将多个静态库合并为一个动态库示例中,这里有几个点我们需要注意下: 在实现我们中间文件拷贝过程中,如果最后没有实现输出 output Action,那么中间文件也不会产生,这在我调试过程中带给了我一阵疑惑

    5.2K20

    现代 CI 系统太复杂,方向跑偏了

    前面我过,CI 系统是一种远程执行代码服务。虽然从传统上看,构建系统是在本地运行 (因此不是服务),但现代构建系统(如 Bazel、Buck、Gradle) 完全不一样。...下面我来解释一下为什么。 在我看来,在一个理想 CI 平台上,我能够要求执行一组特别的任务。我能够使用 API 来定义任务,让平台运行它们、上传工件、报告任务结果以便执行其他依赖任务,等等。... GitHub Actions 和 GitLab Pipelines 这样 CI 产品与其说是平台,不如说是产品,因为它们都是基于一个通用远程执行服务,将一个自成体系配置机制(YAML 文件)和...你最好退出方式可能是被微软 /GitHub、GitLab 或亚马逊 /AWS 这样想在这个领域发展公司收购。...定义 Starlark 方言,这样就可以 Bazel 等构建工具中原语一样定义 CI/ 发布任务。 迫使其他构建工具(如 Bazel)做出改进,缩短构建时间。

    91810

    B 站基于大仓库 CICD 及微服务实践

    其实之前虽然没有做EP一些事情,但是在转团队时候,其实也进行了这样实践。自己也有一些想法,如何快速交付、如何监管代码质量、如何测试等等。 我分享会分为三大块,首先什么是大仓库。...比方基础库从1.0迭代到2.0,如果只能靠行政手段去吼,我架包到2.0,你去申请一下。其实对业务方来说,他其实是没有动力。...比方卡夫卡有一次升级,他代码就做了一些破坏性变更。这个时候我们要升级的话,其实就比较难推动了,有些人用比较老,有些人用比较新,类似这样。...为什么我会去推进Bazel?我发现各个团队都有自己语言,如果基于每一个语言做同样事情其实成本会比较高。所以我们后来发现Bazel其实可以跟语言结合。...第三就是他可扩展,Bazel为什么会出来?就是因为谷歌内部也是一个超大仓库,这是第三点。第四你可以扩展他,因为你可以编写自己,所以我们目前在IOS上大仓实践做还不错。 ?

    86410

    构建抽象

    即构建产生产物,可能是可复用软件包,也可能是可运行应用。 任务。定义构建规则,并执行。 FAQ 为什么没有项目?在业务领域和技术领域,我们对于项目的定义存在着一定歧义性。...于是在诸如 bazel 这样构建工具中,支持自定义包: src/my/app/BUILD src/my/app/app.cc src/my/app/data/input.txt src/my/app...于是,你应用如果不发布,那就没有包名了……。 包布局 构建工具在设计时候,会设计默认软件包分层结构,这个分层架构就是包布局(package layout)。...任务:规则引擎 + DSL 在上述我们看到例子中,很多就是创建了自身 DSL,而后用于构建。只有这样才能让使用者得到最大方便。.../src/index.html'}) ] }; 这里 rules 就是一个简单规则引擎(使用正则表达式来匹配) 两种模式各自有自己优缺点,复杂场景下,使用 DSL + 自定义脚本更容易完成。

    94430

    B 站基于大仓库 CICD 及微服务实践

    其实之前虽然没有做EP一些事情,但是在转团队时候,其实也进行了这样实践。自己也有一些想法,如何快速交付、如何监管代码质量、如何测试等等。 我分享会分为三大块,首先什么是大仓库。...比方基础库从1.0迭代到2.0,如果只能靠行政手段去吼,我架包到2.0,你去申请一下。其实对业务方来说,他其实是没有动力。...比方卡夫卡有一次升级,他代码就做了一些破坏性变更。这个时候我们要升级的话,其实就比较难推动了,有些人用比较老,有些人用比较新,类似这样。...为什么我会去推进Bazel?我发现各个团队都有自己语言,如果基于每一个语言做同样事情其实成本会比较高。所以我们后来发现Bazel其实可以跟语言结合。...第三就是他可扩展,Bazel为什么会出来?就是因为谷歌内部也是一个超大仓库,这是第三点。第四你可以扩展他,因为你可以编写自己,所以我们目前在IOS上大仓实践做还不错。 ?

    4.1K62

    repository_rule() vs rule()

    (regular rules)函数 rule() 来创建自定义规则,但是这些规则都有一个问题:他们依赖于主机系统上安装各种工具。...这样就会出现一个问题,即构建是不可复制,如果同一项目上两个开发人员安装了不同版本 Go SDK,则他们将构建不同二进制文件。它还会中断远程执行,即主机工具链可能在执行平台上不可用。...如果需要在自定义 repository rules 中使用第三方规则库,则需要在 WORKSPACE 调用自定义规则前加载第三方规则库。...git 仓库 与 http 相关规则:@bazel_tools//tools/build_defs/repo:http.bzl http_archive:将 Bazel 相关压缩存档文件远程仓库下载下来...我们则需要去定义工具链以及定义工具链动作,比如编译动作(Action)。最后实现 go_binary,将输入(源文件)传入规则,并调用具体动作实现最后可执行文件生成。

    2.4K20

    Spotify 如何切换到 Bazel 进行 iOS App 构建

    在采用 Bazel 之前,Spotify 使用基于 YAML 定义 Ruby DSL,开发人员可以声明式地添加新模块,包括构建目标的规范、构建它所需源文件、资源和依赖项。...根据 Balestra 说法,这种改进主要得益于 Bazel 高效远程缓存以及它对多台机器并行构建支持。 不过,这个过程并不是直接将构建文件输入到 Bazel 就可以了。...另外,借助 bazel-diff,团队还可以更好地确定每个更改会影响到构建图哪些部分,这样就可以尽可能地减少针对每个新构建所运行测试集。...向 Bazel 迁移最后一步是定义一个发布策略,在将 Bazel 构建直接部署到员工设备上两周之后,再将其推送给外部 Alpha 和 Beta 测试人员,最后向普通用户发布。...Balestra ,所有这些做完之后,切换就成功了,故障和性能指标也没有显示什么异常。

    22120

    Building TensorFlow on Android(译)

    为了让你在Android上开始使用tensorflow,我们将通过两种方式来构建我们移动端Tensorflow例子并将它部署到一个Android设备上。 为什么要选择这些方法之一?...如果您使用自定义操作,或有其他原因从头开始构建Tensorflow,请向下滚动并查看我们有关使用Bazel构建demo说明。...我们来看下安装到手机效果,如下图所示: 注:官网有三个示例,但笔者运行时候发现多了一个TF Speech,应该是做语音识别相关应用,具体大家可以试下。...例如,没有“人”类别,相反,它往往会猜测它通常与人照片相关事物,例如安全带或氧气面罩。...这样提高了用户体验,因为明显帧速率更加快,但是它还能够估计哪些框指向帧之间相同对象,这对于随着时间推移计数对象是重要。 TF Stylize 在摄像头上实现实时风格传输算法。

    91410

    【C++】基础:代码编译与构建工具介绍

    常用构建工具包括: Make:GNU 构建工具,使用 Makefile 文件描述构建规则。 CMake:跨平台构建工具,使用 CMakeLists.txt 文件描述构建规则。...gcc可以将C语言源程序编译、链接成可执行文件,如果没有给出可执行文件名字,gcc将生成一个名为a.out文件(g++类似,是编译C++程序)。...常用构建工具 make make工具相当于一个批处理工具,本身没有编译和链接功能,而是用类似于批处理方式通过调用makefile文件中用户指定编译命令(如gcc、g++)来进行编译和链接(当作批处理工具用就行...makefile文件在github源码安装程序中很常见,下载一个源码包,通常在readme中会有这样一句: make all make install make all即编译所有,当然这个源码包中必须有...DIR_SRCS) 自定义搜索规则: file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp") add_library(demo ${SRC_LIST}) 用于指定从一组源文件

    16210

    每天 3 分钟,小闫带你学 Python(二十六)

    1.模块介绍 大家在练习时候会发现,一个文件中写大量代码会显得臃肿,好像穿了一件面包服,不那么灵活。如何才能夏天一样清爽?...那就是文件尽量精简,只将相关变量、函数等等放在文件中,这样执行起来方便,阅读时候也方便。...模块命名时要符合标识符命名规则,在模块中定义全局变量、函数等都是提供给外界直接使用工具,模块就好比是工具包,要想使用这个工具包中工具,就需要先导入这个模块。...既然学习了编程,强烈建议大家以后所有的文件命名都符合此规则这样在日常电脑使用中就不会因为文件名而报一些莫名其妙错误了。 3.文件内只包含相关内容,一些不想关代码放置到其他模块中或者删除掉。...__all__ 列表中保存全局变量、函数名等,在其他模块使用如下方式导入时,能够被使用: from 模块名 import 名称 也就是, __all__ 可以规定哪些变量和函数等被其他模块使用,哪些不能被使用

    51430

    Istio实战——wasm 构建及使用

    在CPU不是那么强劲年代(2010年左右),PC、手机玩个游戏或者看个高清视频,风扇转起飞,手机烫手当暖手宝。无数用户怒吼某某产品垃圾时候,或许他们不曾想过为什么会那么烫手。...为啥会有这样调调呢?   ...换言之,如果要提取包体数据,需要一个全局变量,并且循环判断end_of_stream 使用 getBufferBytes提取body_buffer_length数据,累加到全局变量上去。...3.8 wasm缓存   现在wasm加载方式,通过一个cache目录挂载到proxy当中,而不是让proxy直接去拉取镜像,为什么这么做呢?...这个是不能接受。所以使用本地缓存(configmap,主机目录,wasme-cache)做一层安全防护,换言之,服务正常(异常)重启都不会去拉取镜像,而是是用本地缓存。   这样就ok吗?没有

    3.9K30

    如何编写线程安全代码?

    可这是为什么呢?为什么多线程代码如此难以正确编写呢? 从根源上思考 关于这个问题,本质上是有一个词语你没有透彻理解,这个词就是所谓线程安全,thread safe。...,这时你就不能像在自己家里一样想怎么用就怎么用想什么时候用就什么时候用,公共场所必须有相应规则,这里规则通常是排队,只有这样公共场所秩序才不会被破坏,线程以某种不妨碍到其它线程秩序使用共享资源就能实现线程安全...怎么样,线程安全定义很简单吧,也就是代码不管是在单个线程还是多个线程中被执行都应该能给出正确运行结果,这样代码是不会出现多线程问题,就像下面这段代码: int func() { int...有的同学可能说,等等,在上一篇文章不是还有代码区和动态链接库吗? 要知道这两个区域是不能被修改,也就是这两个区域是只读,因此多个线程使用是没有问题。...原子操作,原子操作是其在执行过程中是不可能被其它线程打断C++中std::atomic修饰过变量,对这类变量操作无需传统加锁保护,因为C++会确保在变量修改过程中不会被打断。

    75240
    领券