【bazel】 一文读懂Starlark

Starlark 的语言编码

当我们编写工作区和构建文件时,我们使用一种名为 Starlark 的语言进行编码,它是 Python 的一种自定义变体。现在,对于所有 Python 开发人员来说,请保持您的敬意。Starlark 是 Python 的一种变体 - 即该语言的受限版本。【When we write our workspaces and build files, we code in language called Starlark which is a custom variant of Python. Now for all you Python developers out there, hold your high fives. Starlark is a variant of Python - that is, a limited version of the language.】

这是专门为 Bazel 设计的。它旨在具有确定性,并设计为并行运行,例如在完全不同的机器上的核心上运行。因此,您最喜欢的一些语言功能可能已被剔除。

例如,对于 Starlark,类已从语言中提取。您不能使用 import 语句。相反,您使用自定义加载函数。大多数内置函数和大多数方法都不受支持。还有许多其他限制。【This was specifically designed for Bazel. It was meant to be deterministic and designed to run in parallel such as on cores are entirely different machines. Because of this, some of your favorite features of the language may have been culled.

For instance, with Starlark, classes have been pulled from the language. You can’t use the import statement. Instead, you use a custom load function. Most built in functions and most methods aren’t supported. There are a bunch of other limitations as well.】

如果您对 Starlark 的功能感兴趣,那么您应该查看 Starlark 规范。这全面细分了从类型系统到各种内置方法和函数,您可以使用哪些语言功能。

这可能会引出一个问题:你可以用 Starlark 做什么?答案是很多。如果你查看构建 API,你会发现 Bazel 附带了许多开箱即用的函数、对象和类型。通过查看构建 API 文档【https://bazel.build/rules/lib/starlark-overview】,你会看到 Bazel 向我们的脚本公开的所有各种内容。

【If you are interested in what Starlark can do, then you should check out the Starlark specification. This gives a comprehensive breakdown at what language features are available to you from the type system to various built in methods and functions.

This may beg the question as to what you can do with Starlark and the answer is a lot. If you look at the build api, you’ll see that Bazel comes with a lot of functions, objects and types ready to use out of the box. By viewing the build api documentation, you’ll see all the various things that Bazel exposes to our scripts.】
好的,对于那些不懂 Python 的人,我们会写一些代码来让你感到舒适,但你需要

首先,让我们回到我们的 JokeGenerator 项目。这一切都在 monorepo 中,所以我们需要将我们的工作区文件移动到 monorepo 的根目录中。

现在我们将对工作区进行一些修改,以便你在 Starlark 中工作时感到舒适。

首先,让我们创建一个注释。在 Starlark 和 Python 中,我们使用磅号符号。
【Okay, for those of you who don’t know python, we’ll write a little code to comfortable but you’ll need to

To get started, let’s return to our JokeGenerator project. It’s all in a monorepo so we need to move our Workspace file to the root of our monorepo.

Now we’ll make some alterations to the workspace to you comfortable working in Starlark.

创建变量

当然,在编写构建脚本时注释掉代码也很有用。接下来我们将定义一个变量。在这里我们将创建一个简单的名称。【Of course, this is also useful to comment out code while writing your build scripts. Next we’ll define a variable. Here we’ll create a simple name.】

build_name = "JokeGenerator"

现在我们将它打印到控制台。

打印到控制台

print(build_name)

保存文件并切换到命令行。导航到 monorepo 根目录。要启动构建,我们必须调用 JokeGenerator 的构建目标。【Save the file and switch over to the command line. Navigate to the monorepo root. To fire off the build, we have to call the JokeGenerator’s build target.

bazel build //JokeGenerator:knock_knock

您会注意到,我们在构建序列中打印出了一个调试语句。瞧,有一个变量被打印出来了。

我们确实得到了 if 语句,但我们不能在脚本的顶层使用它们。例如,如果我们要检查构建名称,我们需要将其包装到函数中。

让我们添加以下内容来打印出是否允许开玩笑:【We do get if statements, but we can’t use them in the top-level of a script. For example, if we were to check for the build name, we’d need to wrap it into the function.

Let’s add the following to print out whether jokes are allowed:】

if build_name == "JokeGenerator":
	print("Jokes Allowed")
else:
	print("No Jokes Allowed")

现在如果我们保存并构建:

bazel build //JokeGenerator:knock_knock

创建带有 bzl 扩展名的文本文件

我们得到一个错误。欢迎使用 Starlark。在这样的功能中,我们需要定义自己的规则文件。规则文件只是一个带有 bzl 扩展名的文本文件。当我们导入其他语言的规则时,我们会导入 bzl 文件。【And we get an error. Welcome to Starlark. In such a feature, we need to define our own rules file. A rules file is just a text file with a bzl extension. When we import rules for other languages, we import bzl files.】

通过这种方式,我们将逻辑从构建定义中移除。创建一个名为 functions.bzl 的新文件。

现在让我们定义一个方法来获取当前的笑话策略。

def get_joke_policy(name):
	if name == "JokeGenerator":
		return "Jokes Allowed"
	else:
		return "No Jokes Allowed"

保存并返回工作区。我们需要加载新规则。我们使用 load 方法。添加以下内容:

load(“functions.bzl”, “get_joke_policy”)

在这里我们声明我们正在加载函数规则,然后我们使用 get_joke_policy 函数。现在,在运行此构建之前,我们需要提供一个空的构建文件以及我们的自定义规则。

创建一个新的构建文件。现在我们可以调用该函数。

print(get_joke_policy(build_name))

保存文件。现在运行构建。您将看到我们将笑话策略打印到控制台,同时构建运行完成。

我们将在本课程以及其他一些模块中大量使用加载,因此请随意尝试以熟悉情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求&…

14-43 剑和诗人17 - ActiveRAG之主动学习

​​​​​ 大型语言模型 (LLM) 的出现开启了对话式 AI 的新时代。这些模型可以生成非常像人类的文本,并且比以往更好地进行对话。然而,它们在仅依赖预训练知识方面仍然面临限制。为了提高推理能力和准确性,LLM 需要能够整合外部知识。 检索…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

ffmpeg图片视频编辑器工具的安装与使用

title: ffmpeg图片视频编辑器工具的安装与使用 tags: [ffmpeg, 图片, 音频, 视频, 工具, 流媒体] categories: [工具, ffmpeg] FFmpeg是一个开源的命令行工具,广泛用于处理视频和音频文件,包括转换格式、剪辑、混流、解码、编码等。以下是一些基本的FFmp…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层(四层、七层 LVS/HAProxy/nginx) -> Web缓存/应用层(nginx、tomcat) -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层(r…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言:智慧水利的时代背景与意义 二、大数据:水利管理的数据基石 (一)数据收集与整合 (二)数据分析与挖掘 三、物联网:水利管理的感知神经 (一)智能感知与监…

Git 操作补充:cherry-pick、变基

1. 挑选提交合并 git cherry-pick 对于多分支的代码库,将代码从一个分支转移到另一个分支是一种常见的需求,这可以分成两种情况:一种情况是,你需要另一个分支的所有代码变动,那么就采用 git merge;另一种情…

【Unity2D 2022:UI】制作角色血条

一、创建血底UI 1. 创建画布(Canvas) 2. 在画布上添加血底图像(Image)子物体 二、编辑血底UI 1. 将血底图片拖入源图像(Source Image)中 2. 点击设置为图片的原大小(Set Native Size&#x…

算法重新刷题

基础算法 前缀和 一维前缀和 [USACO16JAN] Subsequences Summing to Sevens S - 洛谷 这一题主要是需要结合数学知识来求解&#xff0c; #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>using namespace std;con…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高&#xff0c;室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐&#xff0c;以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

【经验篇】Spring Data JPA开启批量更新时乐观锁失效问题

乐观锁机制 什么是乐观锁&#xff1f; 乐观锁的基本思想是&#xff0c;认为在大多数情况下&#xff0c;数据访问不会导致冲突。因此&#xff0c;乐观锁允许多个事务同时读取和修改相同的数据&#xff0c;而不进行显式的锁定。在提交事务之前&#xff0c;会检查是否有其他事务…

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…

【Linux进程】命令行参数 环境变量(详解)

目录 前言 1. 命令行参数 什么是命令行参数? 2. 环境变量 常见的环境变量 如何修改环境变量? 获取环境变量 环境变量的组织方式 拓展问题 导入环境变量 3. 本地变量* 总结 前言 在使用Linux指令的时候, 都是指令后边根命令行参数, 每个指令本质都是一个一个的可执行程…

JAVA集合框架、CAS、AQS

目录 一、java 的集合框架有哪些? 二、说-下 ArrayList 和 LinkedList? 三、HashSet和TreeSet的区别? 四、HashMap 的数据结构是什么? 五、CAS机制 六、AQS理解 一、java 的集合框架有哪些? Collection 是 Java 集合框架中的一个根接口&#xff0c;位于 java.util 包中。它…

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

微笑背后的秘密:理解自闭症儿童的面部表情控制

在星贝育园自闭症儿童康复学校&#xff0c;我们常常遇到家长们提出的一个有趣而引人深思的问题&#xff1a;“为什么我的孩子似乎控制不住面部表情&#xff0c;尤其是频繁地笑&#xff1f;”这个问题背后&#xff0c;隐藏着自闭症谱系障碍&#xff08;ASD&#xff09;儿童独特的…

Caffeinated for Mac v2.0.6 Mac防休眠应用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 进入休眠状态、屏幕变暗或者启动屏幕保护。 应用介绍 您的屏幕是否总是在您不希望的时候变暗&#xff1f;那么Caffeinated就是您解决这个大麻烦的最好工具啦。Caffeinated是在Caffeine这个非常便捷、有用的工具的基础上开发而来的。Caffeinated…

20240707 每日AI必读资讯

&#x1f9e0;中国生成式AI专利数量超过美国 6 倍 - 中国在2014年至2023年期间申请的生成式AI专利数量达到38210个&#xff0c;超过了美国的6倍。 - 腾讯、平安保险集团和百度是GenAI专利数量最多的中国公司。 - 中国的顶级学术机构和技术生态为生成式AI的发展提供了强大支持…

算法简介:什么是算法?——定义、历史与应用详解

引言 在现代计算机科学中&#xff0c;算法是一个核心概念。无论是编程还是数据分析&#xff0c;算法都扮演着至关重要的角色。在这篇博客中&#xff0c;我们将深入探讨算法的定义、历史背景以及它在计算机科学中的地位和实际应用。 什么是算法&#xff1f; 算法是解决特定问题…

DHCP的原理及配置

目录 一、了解DHCP服务 1.什么是DHCP 1.1DHCP广播 2.使用DHCP的好处 2.1为什么使用DHCP 3.DHCP的模式与分配方式 3.1分配方式 3.2模式 二、DHCP工作原理 1.四次回话 2.重新登录 3.更新租约 4.扩展 三、安装DHCP服务 四、DHCP局部配置并且测试 五、使用…