conan new¶
从预定义的或用户定义的模板创建新的配方(包含 conanfile.py 和其他相关文件)。
conan new¶
$ conan new -h
usage: conan new [-h] [--out-file OUT_FILE]
[-v [{quiet,error,warning,notice,status,,verbose,debug,v,trace,vv}]]
[-cc CORE_CONF] [-d DEFINE] [-f] [-o OUTPUT]
template
Create a new example recipe and source files from a template.
positional arguments:
template Template name, either a predefined built-in or a user-
provided one. Available built-in templates: basic,
cmake_lib, cmake_exe, header_lib, meson_lib,
meson_exe, msbuild_lib, msbuild_exe, bazel_lib,
bazel_exe, autotools_lib, autotools_exe, premake_lib,
premake_exe, local_recipes_index, workspace. E.g.
'conan new cmake_lib -d name=hello -d version=0.1'.
You can define your own templates too by inputting an
absolute path as your template, or a path relative to
your conan home folder.
options:
-h, --help show this help message and exit
--out-file OUT_FILE Write the output of the command to the specified file
instead of stdout.
-v [{quiet,error,warning,notice,status,,verbose,debug,v,trace,vv}]
Level of detail of the output. Valid options from less
verbose to more verbose: -vquiet, -verror, -vwarning,
-vnotice, -vstatus, -v or -vverbose, -vv or -vdebug,
-vvv or -vtrace
-cc CORE_CONF, --core-conf CORE_CONF
Define core configuration, overwriting global.conf
values. E.g.: -cc core:non_interactive=True
-d DEFINE, --define DEFINE
Define a template argument as key=value, e.g., -d
name=mypkg
-f, --force Overwrite file if it already exists
-o OUTPUT, --output OUTPUT
Output folder for the generated files
conan new 命令会在当前工作目录中创建一个新的配方,以及额外的示例文件,例如 CMakeLists.txt 或 test_package 文件夹(根据需要),可用于作为您自己项目的起点或辅助调试过程。
请注意,每个模板都有一些必需的和一些 [可选的] 用户定义的变量,用于自定义生成的文件。
可用的模板有:
basic:创建一个简单的配方,包含一些示例代码和有用的注释,是避免编写样板代码的良好起点。
其变量为:[name], [version], [description], [requires1, requires2, …], [tool_requires1, tool_requires2, …]
alias:创建定义别名到目标配方所需的最小配方。
其变量为:name, [version], target
cmake_lib:创建一个 cmake 库目标,该目标定义一个名为
name的函数,该函数会将编译环境的某些信息打印到标准输出。您可以以以下形式为此模板添加依赖项:conan new cmake_lib -d name=ai -d version=1.0 -d requires=math/3.14 -d requires=magic/0.0这将为
requirements()方法添加math/3.14和magic/0.0的依赖项,在 CMake 中添加必要的find_package,并在生成的ai()函数中添加对math()和magic()的调用。其变量为:name, version, [requires1, requires2, …], [tool_requires1, tool_requires2, …]
cmake_exe:创建一个 cmake 可执行目标,该目标定义一个名为
name的函数,该函数会将编译环境的某些信息打印到标准输出。您可以以以下形式为此模板添加依赖项:conan new cmake_exe -d name=game -d version=1.0 -d requires=math/3.14 -d requires=ai/1.0这将为
requirements()方法添加math/3.14和ai/1.0的依赖项,在 CMake 中添加必要的find_package,并在生成的game()函数中添加对math()和ai()的调用。其变量为:name, version, [requires1, requires2, …], [tool_requires1, tool_requires2, …]
header_lib:创建一个仅头文件的库,该库定义一个名为
name的函数,该函数会将一些输出打印到标准输出。您可以以以下形式为此模板添加依赖项:
conan new header_lib -d name=foo -d version=1.0 -d requires=math/3.14 -d requires=magic/0.0这将为
requirements()方法添加math/3.14和ai/1.0的依赖项,并在生成的foo()函数中添加对math()和ai()的调用。其变量为:name, version, [requires1, requires2, …]
autotools_lib:创建一个 Autotools 库。
其变量为:
name,versionautotools_exe:创建一个 Autotools 可执行文件。
其变量为:
name,versionbazel_lib:Bazel 集成 BazelDeps, BazelToolchain, Bazel 是实验性的。创建一个 Bazel 库。
其变量为:
name,versionbazel_exe:Bazel 集成 BazelDeps, BazelToolchain, Bazel 是实验性的。创建一个 Bazel 可执行文件。
其变量为:
name,versionmeson_lib:创建一个 Meson 库。
其变量为:
name,versionmeson_exe:创建一个 Meson 可执行文件。
其变量为:
name,versionmsbuild_lib:创建一个 MSBuild 库。
其变量为:
name,versionmsbuild_exe:创建一个 MSBuild 可执行文件。
其变量为:
name,versionworkspace:创建一个现成的工作区,包含三个可编辑项:liba、libb(需要 liba)和 app1(需要 libb),以及描述工作区的顶级
CMakeLists.txt、conanws.yml和conanws.py。您可以传递一个
requires变量,例如-d requires=mymath/0.1,为 liba 添加外部依赖。
默认情况下,所有 name 和 version 变量在用户未提供时分别设置为 mypkg 和 0.1。
警告
预定义的内置模板的输出是不稳定的。在未来的版本中,它可能会发生变化,以适应最新的工具或最佳实践。
示例¶
$ conan new basic
生成一个不实现任何自定义功能的 conanfile.py 基本文件。
$ conan new basic -d name=mygame -d requires=math/1.0 -d requires=ai/1.3
为 mygame 生成一个 conanfile.py 文件,该文件依赖于 math/1.0 和 ai/1.3 包。
$ conan new cmake_lib
创建了一个基本的 CMake 库,默认包 name = "mypkg" 和默认包版本 version = "0.1"。
$ conan new cmake_exe -d name=game -d version=1.0 -d requires=math/3.14 -d requires=ai/1.0
为 CMake 可执行目标生成必要的文件。这将在 requirements() 方法中添加 math/3.14 和 ai/1.0 的依赖项,在 CMake 中添加必要的 find_package,并在生成的 game() 函数中添加对 math() 和 ai() 的调用。
自定义模板¶
也可以创建您自己的模板。Conan 主目录中的模板应位于 templates/command/new 文件夹中,每个模板应有一个与模板同名的文件夹。如果我们创建 templates/command/new/mytemplate 文件夹,命令将使用以下方式调用:
$ conan new mytemplate
与其他 Conan 主目录中的文件一样,您可以使用 conan config install <url> 管理这些模板,将它们放在 git 仓库或 http 服务器中,并与您的团队共享。也可以使用任何文件夹中的模板,只需将模板的完整路径传递给 conan new <full_path>,但通常在 Conan 主目录中管理它们更方便。
该文件夹可以包含任意数量的文件。文件名和文件内容都可以使用 Jinja2 语法进行模板化。-d/--define 参数将定义模板的 key=value 输入。
文件内容将如下所示(Jinja2 语法):
# File "templates/command/new/mytemplate/conanfile.py"
from conan import ConanFile
class Conan(ConanFile):
name = "{{name}}"
version = "{{version}}"
license = "{{license}}"
并将需要传递这些值:
$ conan new mytemplate -d name=pkg -d version=0.1 -d license=MIT
并将在当前文件夹生成一个文件:
# File "<cwd>/conanfile.py"
from conan import ConanFile
class Conan(ConanFile):
name = "pkg"
version = "0.1"
license = "MIT"
有一些特殊的 -d/--defines 名称。name 是始终必需的。conan_version 定义将始终自动定义。如果存在 requires 和 tool_requires 定义,它们将自动转换为列表。package_name 将始终定义,默认等于 name。
对于参数化的文件名,文件名本身支持 Jinja2 语法。例如,如果我们存储一个名为 {{name}} 的文件(带有括号),位于模板文件夹 templates/command/new/mytemplate/ 中,而不是上面的 conanfile.py:
{{contents}}
然后,执行:
$ conan new mytemplate -d name=file.txt -d contents=hello!
将在当前目录创建一个名为 file.txt 的文件,其中包含字符串 hello!。
如果模板中有不希望使用 Jinja2 渲染的文件(例如图像文件),那么它们的名称应该添加到模板目录下的一个名为 not_templates 的文件中,每行一个文件名。所以我们可以有一个文件夹:
templates/command/new/mytemplate
|- not_templates
|- conanfile.py
|- image.png
|- image2.png
并且 not_templates 包含字符串 *.png,那么 conan new mytemplate ... 将只通过 Jinja2 渲染 conanfile.py,但两张图像将按原样复制。