一些基本概念

代码变成可执行文件,叫做编译。而先编译这个,还是先编译那个(编译顺序的安排),叫做构建

Make 是最常用的构建工具,诞生于 1977 年,主要用于 C 语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用 Make 构建

make 命令在调用的时候格式为:

make 命令

在执行 make 命令的时候,程序会在当前目录下寻找名为 Makefile 或者 makefile 的文件(注:不带后缀名)。然后会查找文件中是否包含该命令,有就会进行执行。如果只写了 make,没有跟后面的命令,则会默认执行 Makefile 中的第一条命令(如果有的话)

Makefile 的基本形式

Makefile 由一系列规则(rules)组成,每条规则的形式如下所示:

<target> : <prerequisites> 
[tab] <commands>
  • 上面第一行冒号前面的部分,叫做”目标”(target)
  • 冒号后面的部分叫做”前置条件”(prerequisites)
  • 第二行必须由一个 tab 键起首,后面跟着”命令”(commands)
  • “目标”是必需的,不可省略;”前置条件”和”命令”都是可选的,但是两者之中必须至少存在一个

目标(target)

一个目标(target)就构成一条规则。目标通常是文件名,指明 Make 命令所要构建的对象。目标可以是一个文件名,也可以是多个文件名,之间用空格分隔

除了文件名,目标还可以是某个操作的名字,这称为”伪目标”(phony target),例如:

clean:
  rm *.*

上面代码的目标是 clean,它不是文件名,而是一个操作的名字,属于”伪目标 “,作用是删除所有文件

前置条件

前置条件通常是一组文件名,之间用空格分隔。它指定了”目标”是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的 last-modification 时间戳比目标的时间戳新),”目标”就需要重新构建

命令

命令(commands)表示如何更新目标文件,由一行或多行的 Shell 命令组成。它是构建”目标”的具体指令,它的运行结果通常就是生成目标文件

每行命令之前必须有一个 tab 键。如果想用其他键,可以用内置变量 .RECIPEPREFIX 声明,例如:

.RECIPEPREFIX = >
all:
> echo Hello, world

上述代码中使用了”>“来替代 tab 键,则后面的 Makefile 代码只用写”>“就可以了

注释

Makefile 中使用”#“进行注释,如下所示:

# 注释内容

则上面#后面的内容在使用 make 命令时不会执行

回声

在使用 make 命令时,会在终端打印每条命令,然后再执行,这种机制成为 回声

在命令前面加上”@“号,就可以关闭回声,例如:

@# 注释内容

一些基本的 linux 命令

  1. mkdir 命令:用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录(区分大小写)。具体写法如下所示:
mkdir [选项] 目录名
  1. rm 命令:常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。_注:rm 是一个危险的命令,使用的时候要特别当心_。命令格式如下所示:
rm [选项] 文件…

rm 命令的参数如下所示:

  • -f:–force 忽略不存在的文件,从不给出提示
  • -i:–interactive 进行交互式删除
  • -r:-R,–recursive 指示 rm 将参数中列出的全部目录和子目录均递归地删除
  • -v:–verbose 详细显示进行的步骤

例如你想强制性的删除某一个文件夹下面的所有文件,则应该使用命令:

rm -rf 文件夹名称
  1. rmdir 命令:功能是删除空目录,一个目录被删除之前必须是空的。其实 rm 命令也可以实现删除目录,但是使用 rmdir 命令就可以保证删除的一定是空目录,减少删错目录的风险,命令格式如下所示:
rmdir [选项] 目录
  1. mv 命令:move 的缩写,可以用来移动文件或者将文件改名(move (rename) files),是 Linux 系统下常用的命令,经常用来备份文件或者目录,命令格式如下所示:
 mv [选项] 源文件或目录 目标文件或目录

_注_:视 mv 命令中第二个参数类型的不同(是目标文件还是目标目录),mv 命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv 先拷贝,再将原有文件删除,而链至该文件的链接也将丢失

mv 命令的参数如下所示:

  • -b:若需覆盖文件,则覆盖前先行备份
  • -f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
  • -i:若目标文件 (destination) 已经存在时,就会询问是否覆盖
  • -u:若目标文件已经存在,且 source 比较新,才会更新
  • -t:–target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定 mv 的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后
  1. touch 命令:不常用,一般在使用 make 的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件,命令格式如下所示:
touch [选项] 文件
  1. tar 命令(打包压缩命令):利用 tar 命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的

首先弄清楚两个概念:打包和压缩:

  • 打包是指将一大堆文件或目录变成一个总的文件
  • 压缩则是将一个大的文件通过一些压缩算法变成一个小文件

Linux 中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar 命令),然后再用压缩程序进行压缩(gzip bzip2 命令)

常用的 tar 命令:

将指定目录打包并压缩为 FileName.tar.gz 文件
tar -zcvf FileName.tar.gz 目录名称

解压缩解打包 FileName.tar.gz 文件
tar -zxvf FileName.tar.gz
  1. scp 命令:是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有 cp,不过 cp 只是在本机进行拷贝不能跨服务器,而且 scp 传输是加密的。命令格式如下所示:
scp [参数] [原路径] [目标路径]

常用的 scp 命令如下所示:

复制文件:

1. 指定了用户名,命令执行后需要输入用户密码。仅指定了远程的目录,文件名字不变
scp local_file remote_username@remote_ip:remote_folder
2. 指定了用户名,命令执行后需要输入用户密码。指定了文件名
scp local_file remote_username@remote_ip:remote_file
3. 没有指定用户名,命令执行后需要输入用户名和密码。仅指定了远程的目录,文件名字不变
scp local_file remote_ip:remote_folder
4. 没有指定用户名,命令执行后需要输入用户名和密码。指定了文件名
scp local_file remote_ip:remote_file

复制目录:

1. 指定了用户名,命令执行后需要输入用户密码
scp -r local_folder remote_username@remote_ip:remote_folder
2. 没有指定用户名,命令执行后需要输入用户名和密码
scp -r local_folder remote_ip:remote_folder
  1. cp 命令:用来复制文件或者目录,是 Linux 系统中最常用的命令之一,基本的命令格式如下所示:
cp [选项] [-T] 源 目的
或者
cp [选项] 源 目录
或者
cp [选项] -t 目录 源

命令的功能是将源文件复制至目标文件,或将多个源文件复制至目标目录

命令使用示例如下所示:

# 将 test1.txt 文件复制为 text2.txt 文件
cp test1.txt test2.txt
  1. rcp 命令:表示 remote file copy,即远程文件拷贝(复制)。该命令用于在计算机之间拷贝文件。rcp 命令有两种格式,第一种格式用于文件到文件的拷贝;第二种格式用于把文件或目录拷贝到另一个目录中。命令格式如下所示:
rcp [参数] [源文件] [目标文件]

rcp 命令用在远端复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中

命令使用示例如下所示:

# 将 test1 远程复制到 webserver 的 /home/root/test2/ 目录中
rcp test1 webserver:/home/root/test2/

Makefile Demo

deploy:
  # 执行打包命令
  cnpm run build
  # 将 build 目录下所有的文件打包为 front.tar.tgz 文件
  # 将 front.tar.tgz 文件远程发送到 opc 服务器上的指定文件夹中
  tar -czf front.tar.tgz build/* && scp front.tar.tgz opc@opc:/home/logkit-master/
  # 远程到 opc 服务器的指定目录中
  # 将 front 文件夹重命名为 front-back
  # 解压 front.tar.tgz
  # 重命名 build 文件夹为 front
  qssh opc /home/logkit-master/ && mv front front-back && tar -xzf front.tar.tgz && mv build front
  # 删除 front.tar.tgz
  rm front.tar.tgz