diff --git a/.ddev/commands/web/unpack b/.ddev/commands/web/unpack
new file mode 100755
index 0000000000000000000000000000000000000000..305bd932a61d99dc592d4e617f6664a3e47684e1
--- /dev/null
+++ b/.ddev/commands/web/unpack
@@ -0,0 +1,38 @@
+#!/usr/bin/env sh
+
+## Description: Unpacks all recipes' dependencies into the main `composer.json`.
+## Usage: unpack
+## Example: "ddev unpack"
+## Example: "ddev unpack /path/to/project"
+
+# Stop this entire script if any one command fails.
+set -e
+
+# Assume all recipes are located in the current directory.
+recipes=$(find . -maxdepth 1 -type d -name 'drupal_cms*' -printf "drupal/%P\n")
+
+# If a path to the built code base was passed (currently used by our CI process),
+# switch to it.
+test -z "$1" || cd $1
+
+# Configure and install the unpack plugin.
+composer config allow-plugins.ewcomposer/unpack true
+composer config repositories.unpack vcs https://gitlab.ewdev.ca/yonas.legesse/drupal-recipe-unpack.git
+composer require --dev ewcomposer/unpack:dev-master
+
+# First, unpack all the dependencies. Since recipes can depend on other recipes, we
+# need to do this step separately from removing the recipes.
+for name in $recipes; do
+  composer unpack $name
+  echo "Unpacked $name"
+done
+
+# Now that everything is unpacked, we can remove all the recipes from `composer.json`.
+for name in $recipes; do
+  composer remove --quiet --no-update $name
+done
+
+# Remove the unpacked recipes, along with the unpack plugin itself.
+composer remove --minimal-changes --dev ewcomposer/unpack
+composer config --unset allow-plugins.ewcomposer/unpack
+composer config --unset repositories.unpack
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e2af75e929bd163a90f61a286795f46c2a9be139..c81c1cd3eba120ccc1935bc93d06b626b9fd2446 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,9 +32,19 @@ build project:
     - composer config --global repositories.template path $CI_PROJECT_DIR/project_template
     # Create the project.
     - composer create-project drupal/drupal-cms-project $_PROJECT_ROOT --stability=dev
+  after_script:
+    # Turn the built project into an archive that can be downloaded by the public
+    # to spin up projects with Drupal CMS. For now, this means that the recipes and
+    # installer need to NOT be managed by Composer at all. We can remove this kludge
+    # when all of our components are available on Packagist.
+    - .ddev/commands/web/unpack $_PROJECT_ROOT
+    - cd $_PROJECT_ROOT/$_WEB_ROOT
+    - mkdir -p ./profiles/contrib && mv $CI_PROJECT_DIR/drupal_cms_installer ./profiles/contrib
+    - mkdir recipes && mv $CI_PROJECT_DIR/drupal_cms* recipes
+    - composer archive --format=zip --file=drupal-cms --dir=$CI_PROJECT_DIR --working-dir=$_PROJECT_ROOT
   artifacts:
     paths:
-      - project
+      - drupal-cms.zip
     expire_in: 1 hour
   rules:
     - when: on_success
@@ -62,6 +72,8 @@ run tests:
   stage: test
   needs:
     - 'build project'
+  before_script:
+    - unzip -q -d $_PROJECT_ROOT drupal-cms.zip
   script:
     - service apache2 start
     - cd /var/www/html
diff --git a/drupal_cms/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms/tests/src/Kernel/ComponentValidationTest.php
index 938eb3e53625821cf29e8850d0a21893ddb1f035..82b4883f761ae3663dfe302e81f3024d8f55c260 100644
--- a/drupal_cms/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_accessibility_tools/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_accessibility_tools/tests/src/Kernel/ComponentValidationTest.php
index 2d4a3e11ed823ee4a396968d2d9bcf3fd14b9086..0f6d6ddd46f07bfcd98ffcc6d407ee3ec6492185 100644
--- a/drupal_cms_accessibility_tools/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_accessibility_tools/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_accessibility_tools\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_admin_theme/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_admin_theme/tests/src/Kernel/ComponentValidationTest.php
index 47e613ba5f5ad4a7fa5ade1d092d3e057e9ef88a..546956e17f6e27fa917a6c640ce257cbfc9569b8 100644
--- a/drupal_cms_admin_theme/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_admin_theme/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_admin_theme\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_anti_spam/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_anti_spam/tests/src/Kernel/ComponentValidationTest.php
index a70ced1f6bf0716ab3454dc1a2e5901e090a19ac..670c5df143b995c5b87031abed787d8f9dc19bed 100644
--- a/drupal_cms_anti_spam/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_anti_spam/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_anti_spam\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_basic_html_editor/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_basic_html_editor/tests/src/Kernel/ComponentValidationTest.php
index a75746176437bfc4ac1f2dc9b7b662b1016ca90e..f99871dadaa4a3af1a0434e7d36437189bea653f 100644
--- a/drupal_cms_basic_html_editor/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_basic_html_editor/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_basic_html_editor\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_blog/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_blog/tests/src/Kernel/ComponentValidationTest.php
index 775c394a14bbf828753adb22e7ca0fef76091ef4..a332fc4a8f01532b78b978d034b8731e265c48db 100644
--- a/drupal_cms_blog/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_blog/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_blog\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_content_type_base/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_content_type_base/tests/src/Kernel/ComponentValidationTest.php
index fdc4ca431f92928062fcdca686a1390490912edf..cf2d0dcf8927fc7af95ca2f6dfece9b3a3418cb7 100644
--- a/drupal_cms_content_type_base/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_content_type_base/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_content_type_base\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_dashboard/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_dashboard/tests/src/Kernel/ComponentValidationTest.php
index 29724bce97873dda41ca6fba7e58d552358e6481..c9a9d1abf2c1bc3c0428737871e198f487ab4869 100644
--- a/drupal_cms_dashboard/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_dashboard/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_dashboard\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_events/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_events/tests/src/Kernel/ComponentValidationTest.php
index c878de30725c0a7f4e4af76f7430dd5da76568cf..27aba62044c714648dff83c4d0a22cfa63116dd6 100644
--- a/drupal_cms_events/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_events/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_events\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_forms/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_forms/tests/src/Kernel/ComponentValidationTest.php
index e5c3112a2eb8973df94ec9e9e86d5519029c6e0e..0d8c17554523956ed6c05e2b870a85d3be3f3eb3 100644
--- a/drupal_cms_forms/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_forms/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_forms\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_full_html_editor/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_full_html_editor/tests/src/Kernel/ComponentValidationTest.php
index 9fff45a0a2969b4041508b329f92d5738520ce88..0d58f19d3d56aa1c8b1a896cd41d1a1913936c47 100644
--- a/drupal_cms_full_html_editor/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_full_html_editor/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_full_html_editor\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_image_media_type/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_image_media_type/tests/src/Kernel/ComponentValidationTest.php
index f7f08ce5366a449bba7a80f972ade9dab4373188..f6a03f7b9fb36002c4cee8fb8712557d6e21ae1e 100644
--- a/drupal_cms_image_media_type/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_image_media_type/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_image_media_type\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_installer/composer.json b/drupal_cms_installer/composer.json
index 0070e01808f23494cdcabb1db86069352d4c940f..9fc5bcde0c37d11c74c0515058b0e4f4976d6a67 100644
--- a/drupal_cms_installer/composer.json
+++ b/drupal_cms_installer/composer.json
@@ -5,10 +5,5 @@
     "version": "dev-main",
     "require": {
         "drupal/core": ">=10.3"
-    },
-    "autoload": {
-        "psr-4": {
-            "Drupal\\drupal_cms_installer\\": "src"
-        }
     }
 }
diff --git a/drupal_cms_installer/drupal_cms_installer.profile b/drupal_cms_installer/drupal_cms_installer.profile
index a8411a151af61d6e4a216a0974223ea7c928a46e..cd1a4f7c917d32240bd2cb12b9677507849da7e9 100644
--- a/drupal_cms_installer/drupal_cms_installer.profile
+++ b/drupal_cms_installer/drupal_cms_installer.profile
@@ -16,6 +16,11 @@ use Drupal\drupal_cms_installer\Form\SiteNameForm;
  * Implements hook_install_tasks().
  */
 function drupal_cms_installer_install_tasks(): array {
+  // Ensure our forms are loadable in all situations, even if the installer is
+  // not a Composer-managed package.
+  \Drupal::service('class_loader')
+    ->addPsr4('Drupal\\drupal_cms_installer\\', __DIR__ . '/src');
+
   return [
     'drupal_cms_installer_prepare_trial' => [
       'run' => getenv('DRUPAL_CMS_TRIAL') ? INSTALL_TASK_RUN_IF_REACHED : INSTALL_TASK_SKIP,
diff --git a/drupal_cms_locations/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_locations/tests/src/Kernel/ComponentValidationTest.php
index c4253f87b7fd42b7ba0974eb1ea4769f60a06e8a..9633eecd96c5b2eaf4ae459ebd8418e20c7c7393 100644
--- a/drupal_cms_locations/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_locations/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_locations\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_maintenance/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_maintenance/tests/src/Kernel/ComponentValidationTest.php
index 7cb944f7ab5e545acaf48d416da34df79ce38d21..fb1915fd2524368f4ebce64575de287bd92d6293 100644
--- a/drupal_cms_maintenance/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_maintenance/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_maintenance\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_media_tools/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_media_tools/tests/src/Kernel/ComponentValidationTest.php
index 16a6276288bfe59e3c8307b60901b10dc517f5cf..aab125c2c6982e3957d7eab3c793c71709644b9e 100644
--- a/drupal_cms_media_tools/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_media_tools/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_media_tools\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_multilingual/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_multilingual/tests/src/Kernel/ComponentValidationTest.php
index 3258b6460fbdff541f7f8947a52a92e5886abb3a..48c132339483a9b1d2e8f8d0947b1ce77798d292 100644
--- a/drupal_cms_multilingual/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_multilingual/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_multilingual\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_page_content_type/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_page_content_type/tests/src/Kernel/ComponentValidationTest.php
index b40e5e273f624e77083eacf506148220399b49bd..46596b469a593c6a533c6f084d25759d820519e4 100644
--- a/drupal_cms_page_content_type/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_page_content_type/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_page_content_type\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_seo_advanced/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_seo_advanced/tests/src/Kernel/ComponentValidationTest.php
index 7c484878cd070431fa00754305556fc907a0cf97..b545b499d48501edb12ee201daa82f4285b3e8aa 100644
--- a/drupal_cms_seo_advanced/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_seo_advanced/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_seo_advanced\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_seo_basic/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_seo_basic/tests/src/Kernel/ComponentValidationTest.php
index 4bc68202e0e51895fa0d48b3644ff9416de06632..e17665010b13e9a2b77597e4edd9faa1ac4af0e0 100644
--- a/drupal_cms_seo_basic/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_seo_basic/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_seo_basic\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);
diff --git a/drupal_cms_workflows/tests/src/Kernel/ComponentValidationTest.php b/drupal_cms_workflows/tests/src/Kernel/ComponentValidationTest.php
index 762df30bc6e30807b5e6188bfcbd44258b1b23e8..ad0a4117f9af0ea3b37cb54fda67379f601cc696 100644
--- a/drupal_cms_workflows/tests/src/Kernel/ComponentValidationTest.php
+++ b/drupal_cms_workflows/tests/src/Kernel/ComponentValidationTest.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\drupal_cms_workflows\Kernel;
 
-use Composer\InstalledVersions;
 use Drupal\Core\Extension\ThemeInstallerInterface;
 use Drupal\Core\Recipe\Recipe;
 use Drupal\Core\Recipe\RecipeRunner;
@@ -47,7 +46,7 @@ class ComponentValidationTest extends KernelTestBase {
   }
 
   public function test(): void {
-    $dir = InstalledVersions::getInstallPath('drupal/' . explode('\\', __NAMESPACE__)[2]);
+    $dir = realpath(__DIR__ . '/../../..');
 
     // If the recipe is not valid, an exception should be thrown here.
     $recipe = Recipe::createFromDirectory($dir);