【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.mzph.cn/bicheng/42386.shtml

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

相关文章

LeetCode436:寻找右区间

题目链接&#xff1a;436. 寻找右区间 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> findRightInterval(vector<vector<int>>& intervals) {vector<pair<int, int>> startIntervals;int n intervals.size…

H5小游戏开发,广告游戏开发制作

以下是一个 H5 小游戏开发的基本步骤和流程&#xff1a; 需求分析 确定游戏的类型&#xff0c;如益智类、动作类、冒险类等。明确游戏的目标、玩法规则、难度级别、关卡设计等。 技术选型 选择开发框架和工具&#xff0c;常用的 H5 游戏开发框架有 Phaser、CreateJS 等。确定使…

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况&#xff0c;含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装&#xff0c;然后再去运行&#xff0c;此时可…

java-hashset 源码分析 3

### 9. HashSet 的局限性 #### 9.1 无序性 HashSet 不保证元素的顺序&#xff0c;这意味着插入顺序和遍历顺序可能不同。如果需要有序集合&#xff0c;可以考虑使用 LinkedHashSet 或 TreeSet。 #### 9.2 性能依赖于哈希函数 HashSet 的性能高度依赖于哈希函数的质量。如果…

网页生成二维码、在线演示

https://andi.cn/page/621504.html

【OJ】运行时错误(Runtime Error)导致递归爆栈问题

在进行OJ赛时&#xff0c; 题目&#xff1a;给你一个整数n&#xff0c;问最多能将其分解为多少质数的和。在第一行输出最多的质数数量k,下一行输出k个整数&#xff0c;为这些质数。 出现运行时错误 代码如下&#xff1a; def main():# code heren int(eval(input()))list …

《优化接口设计的思路》系列:第2篇—小程序性能优化

优化Uniapp应用程序的性能可以从以下几个方面进行优化&#xff1a; 1.减少页面加载时间&#xff1a;避免页面过多和过大的组件&#xff0c;减少不必要的资源加载。可以使用懒加载的方式&#xff0c;根据用户的实际需求来加载页面和组件。 2.节流和防抖&#xff1a;对于频繁触发…

AI中药处方模型构建与案例

在中医领域,人工智能(AI)可以生成各种指令来辅助诊断、治疗和研究。 1. 诊断辅助指令: 根据患者的症状和体征,自动分析并生成可能的中医证候诊断建议。利用中医望闻问切四诊信息,智能识别关键症状,提供对应的中医辨证思路。2. 治疗建议指令: 根据辨证结果,自动推荐相应…

力扣304.二维区域和检索

力扣304.二维区域和检索 二维前缀和的简单应用 class NumMatrix {vector<vector<int>> sum;public:NumMatrix(vector<vector<int>>& matrix) {int m matrix.size(),n matrix[0].size();sum.resize(m1,vector<int>(n1)); for(int i0;i&…

Java语言程序设计篇一

Java语言概述 Java语言起源编程语言最新排名名字起源Java语言发展历程Java语言的特点Java虚拟机垃圾回收Java语言规范Java技术简介Java程序的结构Java程序注意事项&#xff1a;注释编程风格练习 Java语言起源 1990年Sun公司提出一项绿色计划。1992年语言开发成功最初取名为Oak…

维护el-table列,循环生成el-table

1、lib/setting.js&#xff08;维护table列&#xff09; const columns[{ label: 类型, prop: energyName, width: 150, isText: true },{ label: 消耗量(t或10⁴m), prop: inputNum, isInput: true },{label: CO₂,children: [// { label: 核算因子, prop: co2FactorValue, w…

cs231n作业1——Softmax

参考文章&#xff1a;cs231n assignment1——softmax Softmax softmax其实和SVM差别不大&#xff0c;两者损失函数不同&#xff0c;softmax就是把各个类的得分转化成了概率。 损失函数&#xff1a; def softmax_loss_naive(W, X, y, reg):loss 0.0dW np.zeros_like(W)num_…

【Linux】进程的概念 + 查看进程

前言&#xff1a; 在前面我们学习了Liunx的基本指令和权限相关知识&#xff0c;还有基本工具的使用&#xff0c;有了以上的基础知识我们本章将正式接触Linux操作系统。 目录 1.冯诺依曼体系结构1.1 内存存在的意义1.2 程序加载到内存的含义1.3 程序的预加载&#xff1a; 2 .认识…

安卓备忘录App开发

安卓备忘录APP开发,文章末尾有源码和apk安装包 目标用户: 普通安卓手机用户,需要一个简单易用的备忘录App来记录和管理日常事务。 主要功能: 用户注册: 用户可以创建一个账号,输入用户名和密码。 用户登录: 用户可以通过用户名和密码登录到应用。 用户信息存储: 用户名和…

TCP一定可靠吗

背景 公司某个服务发送TCP报文后,得到的响应是非预期数据 原因竟然是:TCP包的 payload 数据某个bit位被翻转,但是 checksum 的值一样,错误的包被分发给了上层服务 Checksum介绍 IP 头有自己的 Checksum,TCP、UDP 也有自己的 Checksum,分别校验不同部分的数据 IP 头的 …

触摸与指针:深入探索 WebKit 的 Pointer Events 支持

触摸与指针&#xff1a;深入探索 WebKit 的 Pointer Events 支持 在现代 Web 应用中&#xff0c;用户交互的方式越来越多样化&#xff0c;包括触摸、鼠标、笔等多种输入设备。WebKit 作为领先的浏览器引擎之一&#xff0c;对指针事件&#xff08;Pointer Events&#xff09;的…

影响Mongodb数据写入性能的因素

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第83篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

Java面试之并发与网络通信常见面试题

并发编程部分 1. 什么是进程和线程&#xff1f; 进程&#xff1a;操作系统分配资源的最小单位&#xff0c;各个进程之间占据独立的寻址空间&#xff0c;运行也是独立运行&#xff0c;进程间通信需要一些机制。 线程&#xff1a;程序执行的基本单位&#xff0c;一个进程可以开…

android 7.0 tts文字转语音

支持中文的SDK 语音引擎下载 import android.content.Context; import android.speech.tts.TextToSpeech; import android.util.Log;import java.util.Locale;public class SystemTTS {private static final String TAG "SystemTTS";private static SystemTTS insta…

聚星文社一键生成工具绘唐3科技AI工具

聚星文社一键生成工具绘唐3科技AI工具 绘唐3.0——用户文档 - 飞书云文档 聚星文社一键生成工具绘唐3科技AI工具是一个基于人工智能技术的辅助创作工具&#xff0c;可以帮助用户快速生成有关唐朝科技的文本内容。该工具利用自然语言处理和机器学习等技术&#xff0c;通过输入一…