GithubHelp home page GithubHelp logo

tighten / takeout Goto Github PK

View Code? Open in Web Editor NEW
1.6K 22.0 83.0 71.49 MB

Docker-based development-only dependency manager. macOS, Linux, and WSL2-only and installs via PHP's Composer... for now.

License: MIT License

PHP 100.00%
takeout docker-containers docker mysql hacktoberfest

takeout's Introduction

Takeout - Docker-based dependency management

Takeout

Run tests Lint Latest Version on Packagist Downloads on Packagist

Takeout is a CLI tool for spinning up tiny Docker containers, one for each of your development environment dependencies.

It's meant to be paired with a tool like Laravel Valet. It's currently compatible with macOS, Linux, Windows 10 and WSL2.

With takeout enable mysql you're running MySQL, and never have to worry about managing or fixing Homebrew MySQL again.

But you can also easily enable ElasticSearch, PostgreSQL, MSSQL, Mongo, Redis, and more, with a simple command. For a current list of services, look at the classes available in this directory: https://github.com/tighten/takeout/tree/main/app/Services

Requirements

Installation

Install Takeout with Composer by running:

composer global require "tightenco/takeout:~2.7"

Make sure the ~/.composer/vendor/bin directory is in your system's "PATH".

Usage

Run takeout and then a command name from anywhere in your terminal.

One of Takeout's primary benefits is that it boots ("enables") or deletes ("disables") Docker containers for your various dependencies quickly and easily.

Because Docker offers persistent volume storage, deleting a container (which we call "disabling" it) doesn't actually delete its data. That means you can enable and disable services with reckless abandon.

Enable a service

Show a list of all services you can enable.

takeout enable

Enable specific services

Passed the short name of one or more services, enable them.

takeout enable mysql

takeout enable redis meilisearch

Enable services with default parameters

If you want to skip over being asked for each parameter and just accept the defaults. This also works with multiple services in one command.

takeout enable mysql --default

takeout enable redis meilisearch --default

Passthrough Container Arguments

You may specify extra arguments to the container after a -- sepatator:

takeout enable mysql -- -hsome.mysql.host -usome-user

Notice that these are arguments for the container Entrypoint, not extra docker run options (see below).

Extra docker run Options

Under the hood, the takeout enable command generates a docker run command. Sometimes you may want to specify extra options to the docker run command such as an extra environment variable or an extra volume mapping. You can pass a string with all the extra docker run options using the --run= option:

takeout enable mysql --run="{docker-run-options}"

Which would generate the following command:

docker run {docker-run-options} {service-options} mysql/mysql-server

Where {docker-run-options} are the options you specify inside the --run option and {service-options} are generated based on the default options for that service.

Mixing docker run Options With Container Arguments

You may mix and match the run options with the container arguments:

takeout enable mysql --run="{docker-run-options}" -- -hsome.mysql.host -usome-user

Disable a service

Show a list of all enabled services you can disable.

takeout disable

Disable specific services

Passed the short name of one or more services, disable the enabled services that match them most closely.

takeout disable mysql

takeout disable redis meilisearch

Disable all services

takeout disable --all

Start a stopped container

Show a list of all stopped containers you can start.

takeout start

Start specific stopped containers

Passed the container ID of one or more stopped containers, start the stopped containers that matches them.

takeout start {container_id}

takeout start {container_id1} {container_id2}

Start all containers

You may pass the -all flag to start all enabled containers.

takeout start --all

Stop a running container

Show a list of all running containers you can stop.

takeout stop

Stop specific running containers

Passed the container ID of one or more running containers, stop the running containers that matches them.

takeout stop {container_id}

takeout stop {container_id1} {container_id2}

Running multiple versions of a dependency

Another of Takeout's benefits is that it allows you to have multiple versions of a dependency installed and running at the same time. That means, for example, that you can run both MySQL 5.7 and 8.0 at the same time, on different ports.

Run takeout enable mysql twice; the first time, you'll want to choose the default port (3306) and the first version (5.7), and the second time, you'll want to choose a second port (3307), the second version (8.0) and a different volume name (so that they don't share the same mysql_data).

Now, if you run takeout list, you'll see both services running at the same time.

+--------------+----------------+---------------+-----------------------------------+
| CONTAINER ID | NAMES          | STATUS        | PORTS                             |
+--------------+----------------+---------------+-----------------------------------+
| 4bf3379ab2f5 | TO--mysql--5.7 | Up 2 seconds  | 33060/tcp, 0.0.0.0:3306->3306/tcp |
| 983acf46ceef | TO--mysql--8.0 | Up 35 seconds | 33060/tcp, 0.0.0.0:3307->3306/tcp |
+--------------+----------------+---------------+-----------------------------------+

Network Details

Takeout containers are automatically added to a Docker network named takeout. This allows you to use the same aliasing and base aliasing that is used for the other containers.

Each container is given two aliases on this network:

  • A base_alias based on the core dependency name (e.g. mysql, postgres)
  • A full_alias combining the base alias and version (e.g. mysql8.0, postgres13)

Other containers on the takeout network can access Takeout containers by their aliases. Check this article on how you can use sail and takeout together

FAQs

Will this enable the PHP drivers for me via PECL?

Sadly, no.

If I disable a service but Takeout still shows the port as taken, how do I proceed?

First, run lsof -i :3306 (where 3306 is the port that's unavailable.)

If you see output like this:

com.docke   936 mattstauffer   52u  IPv6 0xc0d6f0b06d5c4efb      0t0  TCP localhost:mysql->localhost:62919 (FIN_WAIT_2)
TablePlus 96155 mattstauffer   16u  IPv4 0xc0d6f0b0b6dccf6b      0t0  TCP localhost:62919->localhost:mysql (CLOSE_WAIT)

The solution is to just close your database GUI, and then it should be released.

Why would you use this instead of `docker-compose`?

Using docker-compose sets up your dependencies on a project-by-project basis, which is a perfectly fine way to do things. If it makes more sense to you to have a single copy of each of your dependencies for your entire global environment, Takeout makes more sense.

Will disabling a service permanently delete my databases?

Nope! Your data will stick around! By default almost all of our services use a "volume" to attach your data to for exactly this reason.

So, when you disable the MySQL service, for example, that volume--with all your data in it--will just sit there quietly. And when you re-enable, as long as you attach it to the same volume, all your data will still be there.

Future plans

The best way to see our future plans is to check out the Projects Board, but here are a few plans for the future:

  • Electron-based GUI
  • self-remove command: Deletes all enabled services and then maybe self-uninstalls?
  • upgrade: destroys the old container, brings up a new one with a newly-specified tag (prompt user for it, default latest) and keeps all other parameters (e.g. port, volume) exactly the same as the old one
  • pt/passthrough: proxy commands through to docker (./takeout pt mysql stop)
  • Deliver package in a way that's friendly to non-PHP developers (Homebrew? NPM?)
  • Allow other people to extend Takeout by adding their own plugins (thanks to @angrybrad for the idea!)

Process for release

If you're working with us and are assigned to push a release, here's the easiest process:

  1. Visit the Takeout Releases page; figure out what your next tag will be (increase the third number if it's a patch or fix; increase the second number if it's adding features)
  2. On your local machine, pull down the latest version of main (git checkout main && git pull)
  3. Build for the version you're targeting (php ./takeout app:build)
  4. Run the build once to make sure it works (php ./builds/takeout list)
  5. Commit your build and push it up
  6. Draft a new release with both the tag version and release title of your tag (e.g. v1.5.1)
  7. Use the "Generate release notes" button to generate release notes from the merged PRs.
  8. Hit Publish release
  9. Profit 😆

takeout's People

Contributors

alexmartinfr avatar bakerkretzmar avatar bandgeekndb avatar benholmen avatar cappuc avatar chrisdicarlo avatar chrysanthos avatar danielebarbaro avatar delta1186 avatar dependabot[bot] avatar edalzell avatar faxblaster avatar grantjanecek avatar josecanhelp avatar khanalpride avatar likeadeckofcards avatar markwalet avatar mattstauffer avatar morrislaptop avatar mrailton avatar ndblew-rutgers avatar octoper avatar pmayet avatar r2luna avatar riasvdv avatar therobfonz avatar tonysm avatar viicslen avatar willvincent avatar zoispag avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

takeout's Issues

Install fails - illuminate/container v6.6.1

composer global require tightenco/takeout

Problem 1
- Installation request for tightenco/takeout ^1.0 -> satisfiable by tightenco/takeout[v1.0.0].
- Conclusion: remove illuminate/container v6.6.1
- Conclusion: don't install illuminate/container v6.6.1
- tightenco/takeout v1.0.0 requires laravel-zero/framework ^7.0 -> satisfiable by laravel-zero/framework[v7.0.0, v7.1.0, v7.2.0, v7.2.1].
- laravel-zero/framework v7.0.0 requires illuminate/container ^7.0 -> satisfiable by illuminate/container[v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.10.0, v7.10.1, v7.10.2, v7.10.3, v7.11.0, v7.12.0, v7.13.0, v7.14.0, v7.14.1, v7.15.0, v7.16.0, v7.16.1, v7.17.0, v7.17.1, v7.17.2, v7.18.0, v7.19.0, v7.19.1, v7.2.0, v7.2.1, v7.2.2, v7.20.0, v7.21.0, v7.22.0, v7.22.1, v7.22.2, v7.22.3, v7.22.4, v7.23.0, v7.23.1, v7.23.2, v7.24.0, v7.25.0, v7.26.0, v7.3.0, v7.4.0, v7.5.0, v7.5.1, v7.5.2, v7.6.0, v7.6.1, v7.6.2, v7.7.0, v7.7.1, v7.8.0, v7.8.1, v7.9.0, v7.9.1, v7.9.2].
- laravel-zero/framework v7.1.0 requires illuminate/container ^7.0 -> satisfiable by illuminate/container[v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.10.0, v7.10.1, v7.10.2, v7.10.3, v7.11.0, v7.12.0, v7.13.0, v7.14.0, v7.14.1, v7.15.0, v7.16.0, v7.16.1, v7.17.0, v7.17.1, v7.17.2, v7.18.0, v7.19.0, v7.19.1, v7.2.0, v7.2.1, v7.2.2, v7.20.0, v7.21.0, v7.22.0, v7.22.1, v7.22.2, v7.22.3, v7.22.4, v7.23.0, v7.23.1, v7.23.2, v7.24.0, v7.25.0, v7.26.0, v7.3.0, v7.4.0, v7.5.0, v7.5.1, v7.5.2, v7.6.0, v7.6.1, v7.6.2, v7.7.0, v7.7.1, v7.8.0, v7.8.1, v7.9.0, v7.9.1, v7.9.2].
- laravel-zero/framework v7.2.0 requires illuminate/container ^7.0 -> satisfiable by illuminate/container[v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.10.0, v7.10.1, v7.10.2, v7.10.3, v7.11.0, v7.12.0, v7.13.0, v7.14.0, v7.14.1, v7.15.0, v7.16.0, v7.16.1, v7.17.0, v7.17.1, v7.17.2, v7.18.0, v7.19.0, v7.19.1, v7.2.0, v7.2.1, v7.2.2, v7.20.0, v7.21.0, v7.22.0, v7.22.1, v7.22.2, v7.22.3, v7.22.4, v7.23.0, v7.23.1, v7.23.2, v7.24.0, v7.25.0, v7.26.0, v7.3.0, v7.4.0, v7.5.0, v7.5.1, v7.5.2, v7.6.0, v7.6.1, v7.6.2, v7.7.0, v7.7.1, v7.8.0, v7.8.1, v7.9.0, v7.9.1, v7.9.2].
- laravel-zero/framework v7.2.1 requires illuminate/container ^7.0 -> satisfiable by illuminate/container[v7.0.0, v7.0.1, v7.0.2, v7.0.3, v7.0.4, v7.0.5, v7.0.6, v7.0.7, v7.0.8, v7.1.0, v7.1.1, v7.1.2, v7.1.3, v7.10.0, v7.10.1, v7.10.2, v7.10.3, v7.11.0, v7.12.0, v7.13.0, v7.14.0, v7.14.1, v7.15.0, v7.16.0, v7.16.1, v7.17.0, v7.17.1, v7.17.2, v7.18.0, v7.19.0, v7.19.1, v7.2.0, v7.2.1, v7.2.2, v7.20.0, v7.21.0, v7.22.0, v7.22.1, v7.22.2, v7.22.3, v7.22.4, v7.23.0, v7.23.1, v7.23.2, v7.24.0, v7.25.0, v7.26.0, v7.3.0, v7.4.0, v7.5.0, v7.5.1, v7.5.2, v7.6.0, v7.6.1, v7.6.2, v7.7.0, v7.7.1, v7.8.0, v7.8.1, v7.9.0, v7.9.1, v7.9.2].
- Can only install one of: illuminate/container[v7.0.0, v6.6.1].
- Can only install one of: illuminate/container[v7.0.1, v6.6.1].
- Can only install one of: illuminate/container[v7.0.2, v6.6.1].
- Can only install one of: illuminate/container[v7.0.3, v6.6.1].
- Can only install one of: illuminate/container[v7.0.4, v6.6.1].
- Can only install one of: illuminate/container[v7.0.5, v6.6.1].
- Can only install one of: illuminate/container[v7.0.6, v6.6.1].
- Can only install one of: illuminate/container[v7.0.7, v6.6.1].
- Can only install one of: illuminate/container[v7.0.8, v6.6.1].
- Can only install one of: illuminate/container[v7.1.0, v6.6.1].
- Can only install one of: illuminate/container[v7.1.1, v6.6.1].
- Can only install one of: illuminate/container[v7.1.2, v6.6.1].
- Can only install one of: illuminate/container[v7.1.3, v6.6.1].
- Can only install one of: illuminate/container[v7.10.0, v6.6.1].
- Can only install one of: illuminate/container[v7.10.1, v6.6.1].
- Can only install one of: illuminate/container[v7.10.2, v6.6.1].
- Can only install one of: illuminate/container[v7.10.3, v6.6.1].
- Can only install one of: illuminate/container[v7.11.0, v6.6.1].
- Can only install one of: illuminate/container[v7.12.0, v6.6.1].
- Can only install one of: illuminate/container[v7.13.0, v6.6.1].
- Can only install one of: illuminate/container[v7.14.0, v6.6.1].
- Can only install one of: illuminate/container[v7.14.1, v6.6.1].
- Can only install one of: illuminate/container[v7.15.0, v6.6.1].
- Can only install one of: illuminate/container[v7.16.0, v6.6.1].
- Can only install one of: illuminate/container[v7.16.1, v6.6.1].
- Can only install one of: illuminate/container[v7.17.0, v6.6.1].
- Can only install one of: illuminate/container[v7.17.1, v6.6.1].
- Can only install one of: illuminate/container[v7.17.2, v6.6.1].
- Can only install one of: illuminate/container[v7.18.0, v6.6.1].
- Can only install one of: illuminate/container[v7.19.0, v6.6.1].
- Can only install one of: illuminate/container[v7.19.1, v6.6.1].
- Can only install one of: illuminate/container[v7.2.0, v6.6.1].
- Can only install one of: illuminate/container[v7.2.1, v6.6.1].
- Can only install one of: illuminate/container[v7.2.2, v6.6.1].
- Can only install one of: illuminate/container[v7.20.0, v6.6.1].
- Can only install one of: illuminate/container[v7.21.0, v6.6.1].
- Can only install one of: illuminate/container[v7.22.0, v6.6.1].
- Can only install one of: illuminate/container[v7.22.1, v6.6.1].
- Can only install one of: illuminate/container[v7.22.2, v6.6.1].
- Can only install one of: illuminate/container[v7.22.3, v6.6.1].
- Can only install one of: illuminate/container[v7.22.4, v6.6.1].
- Can only install one of: illuminate/container[v7.23.0, v6.6.1].
- Can only install one of: illuminate/container[v7.23.1, v6.6.1].
- Can only install one of: illuminate/container[v7.23.2, v6.6.1].
- Can only install one of: illuminate/container[v7.24.0, v6.6.1].
- Can only install one of: illuminate/container[v7.25.0, v6.6.1].
- Can only install one of: illuminate/container[v7.26.0, v6.6.1].
- Can only install one of: illuminate/container[v7.3.0, v6.6.1].
- Can only install one of: illuminate/container[v7.4.0, v6.6.1].
- Can only install one of: illuminate/container[v7.5.0, v6.6.1].
- Can only install one of: illuminate/container[v7.5.1, v6.6.1].
- Can only install one of: illuminate/container[v7.5.2, v6.6.1].
- Can only install one of: illuminate/container[v7.6.0, v6.6.1].
- Can only install one of: illuminate/container[v7.6.1, v6.6.1].
- Can only install one of: illuminate/container[v7.6.2, v6.6.1].
- Can only install one of: illuminate/container[v7.7.0, v6.6.1].
- Can only install one of: illuminate/container[v7.7.1, v6.6.1].
- Can only install one of: illuminate/container[v7.8.0, v6.6.1].
- Can only install one of: illuminate/container[v7.8.1, v6.6.1].
- Can only install one of: illuminate/container[v7.9.0, v6.6.1].
- Can only install one of: illuminate/container[v7.9.1, v6.6.1].
- Can only install one of: illuminate/container[v7.9.2, v6.6.1].
- Installation request for illuminate/container (locked at v6.6.1) -> satisfiable by illuminate/container[v6.6.1].

php 7.2 support

Hi, in several projects i had to use php 7.2 and in this specific case i'm using a Laravel 7.26.

Screenshot 2020-08-27 at 10 33 38

Allow a trailing comma in function calls was introduced in 7.3 [https://wiki.php.net/rfc/trailing-comma-function-calls]

Make conflict errors look nicer.

Currently, if there is a container with the same auto-generated name being used, then it will display the full error message on the screen. Maybe add a check for name conflict.

Declare the entire environment in code

Takeout looks awesome! Thanks for the presentation.

We're using a similar approach, but instead of Takeout (why wasn't it there yet..) we're using Docker Compose. The biggest reason for Docker Compose is its declarative configuration.

This makes sure everyone is using the same versions. And you can commit it. This has a lot of benefits.

  • You don't have to tell which versions your developers need to use.
  • Keep track of the dependency versions and test new version when they are released.
  • Run Takeout in CI to set up the exact same environment.

It does mean developers use similar passwords, but this could be asked for when Takeout is bootstrapped.

Update volume names to include the version

  1. takeout install meilisearch
  2. that assumes version is latest
  3. get whatever version latest is going to return by Jose's magic code
  4. then we name the container TO-meilisearch-{version} (e.g. TO-meilisearch-5.7)
  5. In all our lists we can just show the full name
  6. But when deleting, if I pass in meilisearch it will just delete any container that matches TO-meilisearch-* UNLESS there are more than one, which won't happen in v1, at which point we'll give them a menu of options... but building that menu can just be a DD('this should not have happened') right now.

This requires us to add an element to the BaseService, also pointed out by Jose, to track the "organization" of a given container, which may be library or the name of the org supplying the container image:

image


Jose's magic code:

12:16
curl 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/'
12:16
it seems like official libraries are in the library path while non-official ones are like this:
12:17
curl 'https://registry.hub.docker.com/v2/repositories/getmeili/meilisearch/tags/'
12:17
we still have to parse that output, which is just json, so should be simple enough

Install fails with Guzzle 7.0.1 installed

~ composer global require tightenco/takeout

Changed current directory to /Users/dalew/.composer
Using version ^1.0 for tightenco/takeout
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
- Installation request for tightenco/takeout ^1.0 -> satisfiable by tightenco/takeout[v1.0.0].
- Conclusion: remove guzzlehttp/guzzle 7.0.1
- Conclusion: don't install guzzlehttp/guzzle 7.0.1
- tightenco/takeout v1.0.0 requires guzzlehttp/guzzle ^6.5 -> satisfiable by guzzlehttp/guzzle[6.5.0, 6.5.1, 6.5.2, 6.5.3, 6.5.4, 6.5.5].
- Can only install one of: guzzlehttp/guzzle[6.5.0, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.1, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.2, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.3, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.4, 7.0.1].
- Can only install one of: guzzlehttp/guzzle[6.5.5, 7.0.1].
- Installation request for guzzlehttp/guzzle (locked at 7.0.1) -> satisfiable by guzzlehttp/guzzle[7.0.1].

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

Hello! Thank you for this wonderful tool.

I am running into a pickle. Steps to reproduce are very straightforward:

  1. Create a mysql container with takeout enable mysql. I gave it port 3307 (because it complained 3306 was taken, not sure why, since I uninstalled my previous local mysql installation), and also gave it a custom password. It seems to boot up fine, and I am able to connect to it with TablePlus.
  2. Create a new Laravel project with laravel new takeout-test
  3. Set up the .env file with the proper port and password
  4. Try to run migrations

I get this error:

Capture d’écran 2020-08-27 à 10 48 48

Finish Installer UI test

Finish InstallerUiTest

From the original notes there:

    // @todo: Choose the exit option from the UI
    // @todo: ask nuno if this is possible
    // @todo: Assert ... true is true?? ... to make sure we don't get any exceptions

Display STDOUT Docker errors returned on install commands

E.g.
Installed a meilisearch service, with an attached volume, using meilisearch v0.12
Later uninstalled it
Later installed meilisearch again, which now gave me v0.13
meilisearch tried to run the new version on the old volume
And got this error:

Error: Cannot open database, expected MeiliSearch engine version: <0.12.0, current engine version: 0.13.0

But Takeout didn't show me the error. Instead, I found it by running list:services, which showed the container status as "Exited (1)"

MySQL 8: Change default auth on bootup via docker command

MySQL 8 requires (still, I believe!) the use of the --default-authentication-plugin=mysql_native_password flag to work with Laravel (and really just stay inline with user expectations).

@josecanhelp - let me know if I'm wrong on that, I still use 5.7 for the most part!

One way of doing that would be to edit the default service templates to add a $cmd variable, for example, MySQL's:

protected $dockerRunTemplate = '-p "$port":3306 \
        -e MYSQL_ROOT_PASSWORD="$root_password" \
        -v "$volume":/var/lib/mysql \
        "$organization"/"$image_name":"$tag" "$cmd"';

Then we'd have to handle allowing a custom $cmd to be used when starting a container.

For MySQL, the ENTRYPOINT is (for all intents and purposes) mysqld. The Docker CMD can just be flags to pass the mysqld command, like so:

docker run -d mysql:8 --default-authentication-plugin=mysql_native_password

Adding a $cmd to the templates would allow users to add that flag if they wanted.

This addition may mean another default prompt for services, but perhaps it could be a hidden option for advanced usage?

Another idea in this case is to code up a ✨special case conditional✨😅 where MySQL 8+ gets this flag appended to $cmd.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.