Compare commits
4 commits
5d1525234e
...
b21d0dbfc6
Author | SHA1 | Date | |
---|---|---|---|
b21d0dbfc6 | |||
62e0320413 | |||
be5d6a9e4c | |||
bec504d21c |
10 changed files with 54 additions and 20 deletions
|
@ -2,7 +2,7 @@
|
|||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.1.0] - 2025-04-24
|
||||
## [1.0.4] - 2025-04-24
|
||||
### Fixed
|
||||
- Fixed a critical autoloading issue after the package is globally installed.
|
||||
|
||||
|
@ -22,7 +22,6 @@ All notable changes to this project will be documented in this file.
|
|||
- Minor documentation tweak to make the header image display on Packagist.
|
||||
|
||||
## [1.0.0] – 2025-04-24
|
||||
|
||||
### Added
|
||||
- Initial public release of **Loom Spinner CLI**.
|
||||
- Command to spin up a new PHP development environment with Docker (`spin:up`).
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
# Loom Spinner CLI
|
||||
|
||||
<p>
|
||||
<img src="https://img.shields.io/badge/Version-1.1.0-blue" alt="Version 1.1.0">
|
||||
<img src="https://img.shields.io/badge/Version-1.0.4-blue" alt="Version 1.0.4">
|
||||
</p>
|
||||
|
||||
A streamlined environment management tool for PHP developers.
|
||||
|
@ -21,16 +21,13 @@ Effortlessly create custom Docker environments for each of your PHP projects. Ou
|
|||
|
||||
- **PHP 8.4** (includes XDebug & OpCache)
|
||||
- **Nginx**
|
||||
- **SQLite3**
|
||||
- **MySQL 9.3**
|
||||
- **NodeJS 23** (Node, NPM, & NPX)
|
||||
|
||||
Your project directory is automatically mounted to the PHP container, and the `public` directory is served via Nginx at
|
||||
`http://localhost:<nginx-port>`. Access the container directly from your terminal to execute unit tests or other
|
||||
commands, all within an isolated environment.
|
||||
|
||||
> **Note:** Loom Spinner CLI is in early development. For now, only SQLite is supported as the database, but more options
|
||||
> are on the way in future updates.
|
||||
|
||||
# Installation
|
||||
|
||||
**Requirements:**
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "loomlabs/loom-spinner-cli",
|
||||
"description": "A simple command-line Docker environment spinner for PHP.",
|
||||
"version": "1.1.0",
|
||||
"version": "1.0.4",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Loom\\Spinner\\": "src/"
|
||||
|
|
|
@ -7,4 +7,8 @@ PHP_VERSION=%s
|
|||
PHP_PORT=%s
|
||||
|
||||
# Nginx
|
||||
NGINX_PORT=%s
|
||||
SERVER_PORT=%s
|
||||
|
||||
# Database
|
||||
DATABASE_PORT=%s
|
||||
ROOT_PASSWORD=%s
|
12
config/mysql.yaml
Normal file
12
config/mysql.yaml
Normal file
|
@ -0,0 +1,12 @@
|
|||
services:
|
||||
mysql:
|
||||
image: mysql:9.3.0
|
||||
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
|
||||
ports:
|
||||
- ${DATABASE_PORT}:3306
|
||||
expose:
|
||||
- "3306"
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
|
||||
volumes:
|
||||
- ./data/${PROJECT_NAME}/mysql:/var/lib/mysql:cached
|
|
@ -3,7 +3,7 @@ services:
|
|||
build:
|
||||
context: ./nginx
|
||||
ports:
|
||||
- ${NGINX_PORT}:80
|
||||
- ${SERVER_PORT}:80
|
||||
volumes:
|
||||
- ${PROJECT_DIRECTORY}:/var/www/html:cached
|
||||
- ./nginx/conf.d:/etc/nginx/conf.d
|
||||
|
|
|
@ -9,4 +9,5 @@ options:
|
|||
enabled: true
|
||||
database:
|
||||
enabled: true
|
||||
driver: sqlite3
|
||||
driver: mysql
|
||||
rootPassword: docker
|
|
@ -13,7 +13,7 @@ class DockerComposeFileBuilder extends AbstractFileBuilder
|
|||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __construct(Config $config)
|
||||
public function __construct(Config $config, private array $ports)
|
||||
{
|
||||
return parent::__construct($config->getDataDirectory() . '/docker-compose.yaml', $config);
|
||||
}
|
||||
|
@ -25,10 +25,18 @@ class DockerComposeFileBuilder extends AbstractFileBuilder
|
|||
{
|
||||
$this->content = $this->config->getConfigFileContents('php.yaml');
|
||||
|
||||
if ($this->config->isDatabaseEnabled($input) && in_array($this->config->getDatabaseDriver($input), ['sqlite3', 'sqlite'])) {
|
||||
if ($this->config->isDatabaseEnabled($input)) {
|
||||
$databaseDriver = strtolower($this->config->getDatabaseDriver($input));
|
||||
|
||||
if (in_array($databaseDriver, ['sqlite3', 'sqlite'])) {
|
||||
$this->addSqliteDatabaseConfig();
|
||||
}
|
||||
|
||||
if ($databaseDriver === 'mysql') {
|
||||
$this->addMysqlDatabaseConfig();
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->config->isServerEnabled($input)) {
|
||||
$this->addNginxConfig();
|
||||
}
|
||||
|
@ -56,4 +64,12 @@ class DockerComposeFileBuilder extends AbstractFileBuilder
|
|||
$sqlLiteConfig = str_replace('volumes:', '', $sqlLiteConfig);
|
||||
$this->content .= $sqlLiteConfig;
|
||||
}
|
||||
|
||||
private function addMysqlDatabaseConfig(): void
|
||||
{
|
||||
$mysqlConfig = str_replace('services:', '', $this->config->getConfigFileContents('mysql.yaml'));
|
||||
$mysqlConfig = str_replace('${ROOT_PASSWORD}', $this->config->getEnvironmentOption('database', 'rootPassword'), $mysqlConfig);
|
||||
$mysqlConfig = str_replace('${DATABASE_PORT}', (string) $this->ports['database'], $mysqlConfig);
|
||||
$this->content.= $mysqlConfig;
|
||||
}
|
||||
}
|
|
@ -31,10 +31,12 @@ class PHPDockerFileBuilder extends AbstractFileBuilder
|
|||
$this->config->getConfigFileContents('php-fpm/opcache.ini')
|
||||
);
|
||||
|
||||
if ($this->config->isDatabaseEnabled($input) && in_array($this->config->getDatabaseDriver($input), ['sqlite3', 'sqlite'])) {
|
||||
if ($this->config->isDatabaseEnabled($input)) {
|
||||
if (in_array($this->config->getDatabaseDriver($input), ['sqlite3', 'sqlite'])) {
|
||||
$this->addNewLine();
|
||||
$this->content .= $this->config->getConfigFileContents('php-fpm/Sqlite.Dockerfile');
|
||||
}
|
||||
}
|
||||
|
||||
$this->content = str_replace('${NODE_VERSION}', (string) $this->config->getNodeVersion($input), $this->content);
|
||||
|
||||
|
|
|
@ -28,7 +28,8 @@ class SpinCommand extends AbstractSpinnerCommand
|
|||
$this->portGenerator = new PortGenerator();
|
||||
$this->ports = [
|
||||
'php' => $this->portGenerator->generateRandomPort(),
|
||||
'nginx' => $this->portGenerator->generateRandomPort(),
|
||||
'server' => $this->portGenerator->generateRandomPort(),
|
||||
'database' => $this->portGenerator->generateRandomPort(),
|
||||
];
|
||||
|
||||
parent::__construct();
|
||||
|
@ -154,7 +155,9 @@ class SpinCommand extends AbstractSpinnerCommand
|
|||
$input->getArgument('name'),
|
||||
$this->config->getPhpVersion($input),
|
||||
$this->ports['php'],
|
||||
$this->ports['nginx'],
|
||||
$this->ports['server'],
|
||||
$this->ports['database'],
|
||||
$this->config->getEnvironmentOption('database', 'rootPassword')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -166,7 +169,7 @@ class SpinCommand extends AbstractSpinnerCommand
|
|||
{
|
||||
$this->createProjectDataSubDirectory('php-fpm');
|
||||
|
||||
(new DockerComposeFileBuilder($this->config))->build($input)->save();
|
||||
(new DockerComposeFileBuilder($this->config, $this->ports))->build($input)->save();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue