Ronan Blog

罗华东的博客 | 向前每多走一步,热爱和勇气就会多一分。

Makefile

2024-09-02 3 min read Docs Ronan

1.规则

Makefile的框架是由规则构成的。make命令执行时先在Makefile文件中查找各种规则,对各种规则进行解析后运行规则。规则的基本格式为:

每条规则的语法格式:
target1,target2...: depend1, depend2, ...
	command
	......
	......

每条规则由三个部分组成分别是目标(target), 依赖(depend)命令(command)

  • 命令(command): 当前这条规则的动作,一般情况下这个动作就是一个 shell 命令 例如:通过某个命令编译文件、生成库文件、进入目录等。 动作可以是多个,每个命令前必须有一个Tab缩进并且独占占一行。
  • 依赖(depend): 规则所必需的依赖条件,在规则的命令中可以使用这些依赖。 例如:生成可执行文件的目标文件(*.o)可以作为依赖使用 如果规则的命令中不需要任何依赖,那么规则的依赖可以为空 当前规则中的依赖可以是其他规则中的某个目标,这样就形成了规则之间的嵌套 依赖可以根据要执行的命令的实际需求, 指定很多个
  • 目标(target): 规则中的目标,这个目标和规则中的命令是对应的 通过执行规则中的命令,可以生成一个和目标同名的文件 规则中可以有多个命令, 因此可以通过这多条命令来生成多个目标, 所有目标也可以有很多个 通过执行规则中的命令,可以只执行一个动作,不生成任何文件,这样的目标被称为伪目标

这里看着脑疼,举个例子

################# 例1 #################
app:a.c b.c c.c
	gcc a.c b.c c.c -o app

################# 例2 #################
# 有多个目标, 多个依赖, 多个命令
app,app1:a.c b.c c.c d.c
	gcc a.c b.c -o app
	gcc c.c d.c -o app1
	
################# 例3 #################	
# 规则之间的嵌套
app:a.o b.o c.o
	gcc a.o b.o c.o -o app
# a.o 是第一条规则中的依赖
a.o:a.c
	gcc -c a.c
# b.o 是第一条规则中的依赖
b.o:b.c
	gcc -c b.c
# c.o 是第一条规则中的依赖
c.o:c.c
	gcc -c c.c

2.规则的执行

在调用 make 命令编译程序的时候,make 会首先找到 Makefile 文件中的第 1 个规则,分析并执行相关的动作。但是需要注意的是,好多时候要执行的动作(命令)中使用的依赖是不存在的,如果使用的依赖不存在,这个动作也就不会被执行。

Continue reading

fire,一个强大的「python」库

2024-09-02 2 min read Docs Ronan

Github地址:https://github.com/google/python-fire

在开发命令行工具时,开发者通常需要编写大量代码来解析命令行参数,这既耗时又容易出错。Python Fire 是 Google 开源的一个库,旨在简化命令行界面的开发。它可以将任何 Python 对象自动生成一个命令行界面,从而大大减少了开发时间和代码复杂度。本文将详细介绍 Python Fire 库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

安装

要使用 Python Fire 库,首先需要安装它。以下是安装步骤:

使用 pip 安装

可以通过 pip 直接安装 Python Fire:

pip install fire

特性

  1. 自动生成命令行界面:将任何 Python 对象(函数、类、模块、字典等)自动转换为命令行界面。
  2. 简洁性:只需一行代码即可生成命令行界面,大大减少了开发时间和代码复杂度。
  3. 灵活性:支持多种数据类型和参数,能够处理复杂的命令行需求。
  4. 易用性:与 Python 标准库无缝集成,易于上手和使用。

基本功能

将函数转换为命令行工具

可以将一个简单的函数转换为命令行工具:

import fire

def greet(name):
    return f'Hello, {name}!'

if __name__ == '__main__':
    fire.Fire(greet)

在命令行中运行:

python greet.py John

输出:

Hello, John!

将类转换为命令行工具

可以将一个类转换为命令行工具:

import fire

class Calculator:
    def add(self, a, b):
        return a + b

    def multiply(self, a, b):
        return a * b

if __name__ == '__main__':
    fire.Fire(Calculator)

在命令行中运行:

Continue reading

Dockerfile的简单实现

2024-09-02 4 min read Docs Ronan

构建第一个Dockerfile

假设该镜像实现的等同于我们在已经配置好python环境的机器上通过python hello.py命令来运行一个python脚本

所以该Dockerfile的构建有以下步骤:

  1. 在桌面或其他位置新建一个文件夹,假设文件夹名为docker
  2. 在docker新建一个hello.py文件,hello.py已经实现所需功能
  3. 再在docker新建一个Dockerfile注意:仅开头且必须大写

以下是Dockerfile内容:

FROM python:3.9.19-alpine3.18
COPY hello.py /hello.py
CMD python hello.py

Dockerfile语法说明

Dockerfile 是 Docker 构建镜像的描述文件,它包含了一系列指令,描述了如何从基础镜像创建一个新的 Docker 镜像。

下面是 Dockerfile 中常用指令的说明及其语法,参考自Docker Dockerfile | 菜鸟教程 (runoob.com):

Dockerfile 指令说明
FROM指定基础镜像,用于后续的指令构建。
MAINTAINER指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL添加镜像的元数据,使用键值对的形式。
RUN在构建过程中在镜像中执行命令。
CMD指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT设置容器创建时的主要命令。(不可被覆盖)
EXPOSE声明容器运行时监听的特定网络端口。
ENV在容器内部设置环境变量。
ADD将文件、目录或远程URL复制到镜像中。
COPY将文件或目录复制到镜像中。
VOLUME为容器创建挂载点或声明卷。
WORKDIR设置后续指令的工作目录。
USER指定后续指令的用户上下文。
ARG定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

详细说明:

Continue reading
Older posts Newer posts