【bazel】 一文读懂Starlark

news2024/10/6 3:06:17

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.coloradmin.cn/o/1904148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习第四十六周周报 FMP

文章目录 week46 FMP摘要Abstract1. 题目2. Abstract3. FMP3.1 优化框架3.2 优化器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现1. FMP2. fairGNN小结参考文献 week46 FMP 摘要 本周阅读了题为Chasing Fairness in Graphs: A GNN Architecture Per…

永磁同步电机控制算法--最大转矩电流比控制(虚拟信号注入法)

目前,国内外相关学者对 MTPA 控制方法进行了一系列的理论研究与仿真分析。通过研究取得的成果综合来看,该控制方法主要有:直接公式计算法、曲线拟合法、查表法、搜索法、高频信号注入法以及参数辨识法等。 之前的文章中已经介绍了直接公式计…

ASP.NET Core----基础学习03----开发者异常页面 MVC工作原理及实现

文章目录 1. 开发者异常页面(1)Startup.cs 页面的基础配置(2)自定义显示报错代码的前后XX行 2. MVC 的原理3. MVC 的实现4.默认路由路径5.返回Json字符串 1. 开发者异常页面 (1)Startup.cs 页面的基础配置 namespace ASP.Net_Blank {public class Startup{private readonly IC…

Matlab协方差矩阵分解法生成随机场

Matlab协方差矩阵分解法生成随机场 相关系数矩阵 % function outcohesion(x,y,mu,theta) % end % xyload(F:\Research-OUC\基于机器许学习模型的海底斜坡可靠度研究\基于comsol的斜坡稳定性分析\comsol网格操作\grid_operate-matlab.mphtxt); % xxy(:,1); % yxy(:,2); Xlinspac…

前端JS特效第22集:html5音乐旋律自定义交互特效

html5音乐旋律自定义交互特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>ChimeTime™</title…

Spring源码十二:事件发布源码跟踪

上一篇我们在Spring源码十一&#xff1a;事件驱动中&#xff0c;介绍了spring refresh方法的initMessageSource方法与initApplicationEventMulticaster方法&#xff0c;举了一个简单的例子进行简单的使用的Spring为我们提供的事件驱动发布的示例。这一篇我们将继续跟踪源码&…

谷粒商城学习笔记-使用renren-fast-vue框架时安装依赖包遇到的问题及解决策略

文章目录 1&#xff0c;npm error Class extends value undefined is not a constuctor or null2&#xff0c;npm warn cli npm v10.8.1 does not support Node.js v16.20.2.3&#xff0c;npm error code CERT_HAS_EXPIRED学习心得 这篇文章记录下使用renren-fast-vue&#xff…

花所Flower非小号排名20名下载花所Flower

1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台&#xff0c;致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名&#xff0c;为用户提供多样化的数字资产交易服务&#xff0c;涵盖了主流和新兴数字货币的交易需求。 2. Flowe…

SQL之delete、truncate和drop区别

MySQL删除数据的方式都有哪些&#xff1f; 常用的三种删除方式&#xff1a;通过 delete、truncate、drop 关键字进行删除&#xff1b;这三种都可以用来删除数据&#xff0c;但场景不同。 一、从执行速度上来说 drop > truncate >> DELETE;二、从原理上讲 1、DELET…

Guitar Pro8.2让你的吉他弹奏如虎添翼!

亲爱的音乐爱好者们&#xff0c;今天我要跟大家安利一个让我彻底沉迷其中的神器——Guitar Pro8.2&#xff01;这可不是一般的软件&#xff0c;它简直是吉他手们的福音。不管你是初学者还是老鸟&#xff0c;这个打谱软件都能给你带来前所未有的便利和价值。 让我们来聊聊Guita…

原理图设计工作平台:capture和capture CIS的区别在于有没有CIS模块

1环境:design entry CIS 2.参数设置命令options——preference&#xff08;7个选项卡colors/print&#xff0c;grid display&#xff0c;miscellaneous&#xff0c;pan and zoom&#xff0c;select&#xff0c;text editor和board simulation&#xff09; 1)颜色设置colors/p…

12 电商高并发缓存实战

序章 项目代码缓存的数据一致性 延时双删 淘汰缓存写数据库休眠1s,再次淘汰缓存缺点:如果mysql是主从复制,去从库中拿去数据,此时同步数据还未完成,拿到的数据是旧数据。 先更新 DB,后删除缓存 采用异步延时删除策略. ①利用消息队列进行删除的补偿。②Mysql 数据库更新操…

深入理解并发、线程与等待通知机制

目录 一、基础概念 进程和线程 进程 线程 Java 线程的无处不在 进程间的通信 进程间通信有几种方式&#xff1f; CPU 核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09; 并行和并发 二、认识 Java 里的线程 Java 程序天生就是多线程的 线程的…

python语句性能分析

1、for语句性能优于while import timeif __name__ __main__:start_time time.time()for i in range(10 ** 8):passend_time time.time()run_time end_time - start_timeprint(run_time)i 0start_time time.time()while i < 10 ** 8:i 1end_time time.time()run_tim…

【Spring Cloud】微服务的简单搭建

文章目录 &#x1f343;前言&#x1f384;开发环境安装&#x1f333;服务拆分的原则&#x1f6a9;单一职责原则&#x1f6a9;服务自治&#x1f6a9;单向依赖 &#x1f340;搭建案例介绍&#x1f334;数据准备&#x1f38b;工程搭建&#x1f6a9;构建父子工程&#x1f388;创建父…

Spring Boot的无缝衔接:深入解析与实践

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ &#x1f680;The begin&#x1f697;点点关注&#xff0c;收藏不迷路&#x1f6a9; 引言 在快速迭代的软件开发环境中&#xff0c;无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键。Spring Boo…

嵌入式c语言5——位运算符

<<与>>是c语言中两个移位运算符&#xff0c;分别有乘以2与除以2的意义 位运算符还包括&#xff0c;与&&#xff0c;或|&#xff0c;均进行按位操作 同时&#xff0c;还可以进行取反以及异或操作

【C++】cout.self()函数

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 学习笔记&#xff0c;借鉴了部分大佬案例 &#x1f4e2;未来很长&#…

web前端开发——开发环境和基本知识

今天我来针对web前端开发讲解一些开发环境和基本知识 什么是前端 前端通常指的是网站或者Web应用中用户可以直接与之交互的部分&#xff0c;包括网站的结构、设计、内容和功能。它是软件开发中的一个专业术语&#xff0c;特别是指Web开发领域。前端开发涉及的主要技术包括HTML…

C++语言相关的常见面试题目(一)

1. const关键字的作用 答&#xff1a; 省流&#xff1a;&#xff08;1&#xff09;定义变量&#xff0c;主要为了防止修改 (2) 修饰函数参数&#xff1a;防止在函数内被改变 &#xff08;3&#xff09;修饰函数的返回值 &#xff08;4&#xff09;修饰类中的成员函数 2. Sta…