catchdigital / drucker

Docker + drupal composer stack

安装: 108

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 4

分支: 0

开放性问题: 4

类型:项目

3.0.0 2023-02-22 19:45 UTC

README

简介

Docker compose 启动集。

设置

  • NGINX:来自 Docker Hub 的最新版本。
  • PHP 7-fpm:优化的 7.4.4 版本
  • Percona:5.7 版本

创建项目

使用 composer 创建新项目。请将 ${project_name} 替换为您的项目名称。这将成为您应用程序的根目录:composer create-project catchdigital/drucker ${project_name}

如果 settings.php 文件在 Drupal 核心中被更新,您需要在 settings.php 中取消注释最后 3 行以包含 settings.local.php

更新项目

应创建一个 .env 文件,作为 .env.example 的副本。请根据您的需要随意添加/更新任何变量。

运行 docker compose docker-compose up -d server

如果您已在 hosts 文件中设置了域名,您应该能够在 https://vm.localhost/ 或您想要运行的任何域名上访问站点。

其他有用命令

停止 docker stack docker-compose stop

销毁整个 docker stack。这也会删除数据库。 docker-compose down

下一步

如有需要,请安装 contrib 主题,创建您自己的主题,并使用您的 ${theme} 名称更新 webpack。

之后,您应该能够在项目的根目录中构建 css 和 javascript:npm run build。这将在主题的构建文件夹中生成文件。不要忘记将构建文件添加到您的库中,并为每个库创建不同的入口点,以便在 twig 模板周围拆分。

为了为每个入口点动态添加依赖项,您应该在您的主题中添加以下钩子。

/**
 *
 * Implements hook_library_info_alter() for webpack chunks dependencies.
 */
function hook_library_info_alter(&$libraries, $extension) {
  // We only want to modify current theme extensions
  if ($extension === '${theme}') {
    // Load chunks dependencies from stats file.
    $stats = file_get_contents(DRUPAL_ROOT . "/../webpack.stats.json");
    $stats = Json::decode($stats);
    // Create and attach code splits.
    foreach($stats['namedChunkGroups'] as $name => $lib) {
      // Loop through require files.
      $reqAssets = $lib['assets'];
      if (isset($libraries[$name])) {
        $libraries = addNewLibrary($libraries, $reqAssets, $name);
      }
    }
  }
}

function addNewLibrary($libraries, $reqAssets, $name) {
  foreach($reqAssets as $asset) {
    $requireLib = str_replace('.bundle.js', '', $asset['name']);
    // Dependency exists?
    if (empty($libraries["asset-$requireLib"])) {
      $filename = "build/" . $asset['name'];
      $libraries["asset-$requireLib"] = [
        "js" => [
          $filename => []
        ]
      ];
      $excludedLibraries = ["500", "396"];
      if (in_array($requireLib, $excludedLibraries)) {
        $libraries["asset-$requireLib"]["js"][$filename] = [
          "minified" => false,
          "attributes" => [
            "async" => true,
            "defer" => true
          ]
        ];
      }
    }
    if (isset($libraries[$name]['dependencies'])) {
      $libraries[$name]['dependencies'][] = "${theme}/asset-$requireLib";
    } else {
      $libraries[$name]['dependencies'] = ["${theme}/asset-$requireLib"];
    }
  }
  return $libraries;
}

每个入口点的单个库必须根据 webpack 中的定义手动创建,并且它们应该使用相同的名称。如果使用 catchify 主题,这将是自动发生的。