CiviCRM 的命令行工具


README

cv 命令是用于与 CiviCRM 安装交互的实用程序。它执行自动扫描以定位和启动 CiviCRM 安装。它提供对辅助函数和配置数据的命令行访问,例如 APIv3 和网站 URL。

要求

  • PHP v7.3+。
  • 本地 CiviCRM 安装。
  • 具有特殊文件布局的系统可能需要配置引导

下载

cv 以 PHAR 格式分发,这是一种便携式可执行文件(用于 PHP)。它应该在大多数已安装 PHP 的类 Unix 系统上运行。以下是三种快速下载方法

还有其他几种下载 cv 的方法。另请参阅

文档

cv 提供了许多子命令。要查看列表,请在没有任何参数的情况下运行 cv

要获取特定子命令的详细帮助,请使用 -h,例如 cv api -h

有一些通用约定

  • 许多子命令支持常见的引导选项,例如 --user--level--test
  • 许多子命令支持使用 --out 的多种输出格式。您可以使用环境变量设置一个一般的首选项,例如 export CV_OUTPUT=json-prettyexport CV_OUTPUT=php

示例:CLI

me@localhost$ cd /var/www/my/web/site

## Clear caches
me@localhost$ cv flush

## Manage extensions
me@localhost$ cv ext -Li
me@localhost$ cv dl cividiscount
me@localhost$ cv en cividiscount
me@localhost$ cv dis cividiscount
me@localhost$ cv path -x cividiscount
me@localhost$ cv url -x cividiscount

## Manage settings
me@localhost$ cv vget
me@localhost$ cv vget /mail/
me@localhost$ cv vset mailerBatchLimit=100

## Call APIs
me@localhost$ cv api3 contact.get last_name=Smith
me@localhost$ cv api4 Contact.get +w last_name=Smith

## Improvise PHP
me@localhost$ cv ev 'echo Civi::paths()->getPath("[civicrm.root]/.");'
me@localhost$ cv scr /path/to/my-script.php
me@localhost$ cv cli

## Improvise web requests
me@localhost$ cv url civicrm/dashboard --open
me@localhost$ cv url civicrm/dashboard --open -LU admin
me@localhost$ cv http civicrm/dashboard
me@localhost$ cv http civicrm/dashboard -LU admin

## Inspect events and services
me@localhost$ cv event
me@localhost$ cv event /flexmailer/
me@localhost$ cv service
me@localhost$ cv service /flexmailer/

如果您打算运行单元测试,并且如果您不使用 civibuild,那么您可能需要提供一些额外的网站信息(例如测试用户的名称)。为此,请运行

me@localhost$ cd /var/www/my/web/site
me@localhost$ cv vars:show
me@localhost$ cv vars:fill
me@localhost$ vi ~/.cv.json
me@localhost$ cv vars:show

示例:PHP

假设您有一个独立的脚本或测试运行器,需要在 CiviCRM 网站上下文中执行。您不想将其硬编码到特定路径、创建特殊用途的配置文件或需要特定的目录结构。相反,调用 cv php:booteval()。最简单的方法

eval(`cv php:boot`)

然而,创建一个小的包装函数来提高错误处理和输出解析会更好。

/**
 * Call the "cv" command.
 *
 * @param string $cmd
 *   The rest of the command to send.
 * @param string $decode
 *   Ex: 'json' or 'phpcode'.
 * @return string
 *   Response output (if the command executed normally).
 * @throws \RuntimeException
 *   If the command terminates abnormally.
 */
function cv($cmd, $decode = 'json') {
  $cmd = 'cv ' . $cmd;
  $descriptorSpec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => STDERR);
  $env = (!empty($_ENV) ? $_ENV : getenv()) + array('CV_OUTPUT' => 'json');
  $process = proc_open($cmd, $descriptorSpec, $pipes, __DIR__, $env);
  fclose($pipes[0]);
  $result = stream_get_contents($pipes[1]);
  fclose($pipes[1]);
  if (proc_close($process) !== 0) {
    throw new RuntimeException("Command failed ($cmd):\n$result");
  }
  switch ($decode) {
    case 'raw':
      return $result;

    case 'phpcode':
      // If the last output is /*PHPCODE*/, then we managed to complete execution.
      if (substr(trim($result), 0, 12) !== "/*BEGINPHP*/" || substr(trim($result), -10) !== "/*ENDPHP*/") {
        throw new \RuntimeException("Command failed ($cmd):\n$result");
      }
      return $result;

    case 'json':
      return json_decode($result, 1);

    default:
      throw new RuntimeException("Bad decoder format ($decode)");
  }
}

eval(cv('php:boot', 'phpcode'));
$config = cv('vars:show');
printf("We should navigate to the dashboard: %s\n\n", cv('url civicrm/dashboard'));

示例:NodeJS

查看 https://github.com/civicrm/cv-nodejs

Bootstrap

cv必须找到并引导本地实例的CiviCRM、Drupal、WordPress或类似的。这可能以几种方式工作

  • 自动:默认情况下,cv会检查当前目录和每个父目录,以查找已知环境的证据(如Drupal或WordPress)。

    自动搜索旨在与默认站点布局一起工作——就像从drupal.orgwordpress.org或类似的典型“zip”或“tar”文件中看到的那样。一些部署添加了更多高级选项——例如配置“多站点”,添加定制的“符号链接”或移动wp-admin文件夹。对于高级布局,您可能需要设置环境变量。

  • CIVICRM_BOOT新协议):首先引导CMS(然后要求它引导CiviCRM)。这更符合典型的HTTP页面浏览,并且与core:install等命令兼容。设置此环境变量以指定CMS类型和基本目录。比较

    export CIVICRM_BOOT="Drupal://var/www/public"
    export CIVICRM_BOOT="Drupal8://admin@/var/www/public"
    export CIVICRM_BOOT="WordPress:/$HOME/sites/my-wp-site/web/"
    export CIVICRM_BOOT="Auto://."
  • CIVICRM_SETTINGS旧协议):首先引导CiviCRM(然后要求它引导CMS)。设置此环境变量以指定civicrm.settings.php的位置。比较

    export CIVICRM_SETTINGS="/var/www/sites/default/files/civicrm.settings.php"
    export CIVICRM_SETTINGS="Auto"

    (注意:在旧协议中,cv先加载CiviCRM,然后要求CiviCRM引导CMS。然而,这不太符合典型的HTTP页面浏览,并且与core:install等命令不兼容。您可能用于无头测试或作为在标准协议中发现任何错误时的备用/解决方案。)

注意:在没有配置变量的情况下,自动模式的行为类似于CIVICRM_SETTINGS="Auto"(在v0.3.x中)。这计划在v0.4.x中更改,其中它将类似于CIVICRM_BOOT="Auto://."

此外,一些部署处理多个站点(“多站点”/“多域名”)。您应使用--hostnameHTTP_HOST指定特定站点。

以下是一些将这些放在一起的一些示例

## Use --hostname for a domain
export CIVICRM_BOOT="WordPress:/$HOME/public_html/"
cv --hostname='www.example.org' ext:list -L
## Use HTTP_HOST for a domain
export CIVICRM_BOOT="WordPress:/$HOME/public_html/"
export HTTP_HOST=www.example.org
cv ext:list -L
## Use --hostname for a subfolder
export CIVICRM_BOOT="WordPress:/$HOME/public_html/"
cv --hostname='www.example.org/nyc' ext:list -L

自动完成

基于stecman/symfony-console-completion的shell自动完成有限/实验性支持。要启用它

# BASH ~4.x, ZSH
source <(cv _completion --generate-hook)

# BASH ~3.x, ZSH
cv _completion --generate-hook | source /dev/stdin

# BASH (any version)
eval $(cv _completion --generate-hook)

开发

有关更多信息,请参阅doc/develop.md