## Overview
SilverStripe started as an "archive" download before `composer` w…as a thing. Since then, we've spent a lot of time making `composer install` as smooth as possible, including writing our own [recipe-plugin](https://github.com/silverstripe/recipe-plugin) for it. While you can still "install" SilverStripe from an archive, your website becomes practically unmaintainable without `composer update` since modules don't provide their own individual archive downloads. So in effect, everyone using SilverStripe is already using composer.
The archive download on silverstripe.org complicates our release process (S3 buckets, additional `cow` release steps). It has been a time sink (e.g. path lengths in tar.gz), and there's more outstanding issues (e.g. 300MB file size due to `.git` inclusion, builds for PHP 5.x). Rather than fixing those, I propose that we remove the archive download option.
There's likely some edge case uses which rely on archive downloads for some scripted purposes, which would break when we stop publishing those archives. But I highly doubt that they're part of production deployment workflows, given the existing limitations outlined above.
## Validation
I've done some research on this based on our recent drive to [remove the installer](https://github.com/silverstripe/silverstripe-framework/issues/9195).
* *Archive download stats*: According to our Google Analytics custom event setup on silverstripe.org/download, we have around 300 downloads per month. This excludes anyone who disables Google Analytics tracking during downloads, or uses other tools to download it (e.g. `curl`).
* *Packagist install stats*: We have around [2000 packagist installs](https://packagist.org/packages/silverstripe/installer/stats) of silverstripe/installer. Note that roughly speaking, ~10% (~225) of these installs are based on our ci builds - ~25 builds times 9 jobs.
* *Download page views*: We've had 1800 page views on silverstripe.org/download in the last 30 days, so with ~300 archive downloads that's a ~16% conversion rate, with the remainder either choosing not to download, or using composer.
* Laravel seems to be doing fine without a download as well. Drupal has one because they're far behind in composer. [CraftCMS](https://docs.craftcms.com/v3/installation.html#step-1-download-craft) has an archive download as an alternative to the default composer instructions.
## Notes
I've confirmed that our CI counts towards those stats, see [notify-on-install](https://getcomposer.org/doc/06-config.md#notify-on-install) which is enabled by default. I can't see how projects would count towards those stats *after* the initial installation, even if they keep the `silverstripe/installer` name in their root `composer.json`. Tracked this down to [InstallationManager->notifyInstalls()](https://github.com/composer/composer/blob/master/src/Composer/Installer/InstallationManager.php#L255) in the composer source code. When running `composer create-project silverstripe/installer installer; cd installer; git init .; git add .; composer update`, I don't get another stat count. Since custom projects would be "installed" via `git clone <url>; composer install` rather than `composer create-project`, they wouldn't count towards install stats either (different repo URL). I've confirmed that with some debug output in `InstallationManager` on `composer install`, here's the full payload which is sent to `packagist.org/downloads/`. Note that it doesn't include `silverstripe/installer`:
```json
{"downloads":[{"name":"composer\/installers","version":"1.7.0.0"},{"name":"silverstripe\/recipe-plugin","version":"1.3.0.0"},{"name":"silverstripe\/vendor-plugin","version":"1.4.0.0"},{"name":"bramus\/ansi-php","version":"3.0.2.0"},{"name":"bramus\/monolog-colored-line-formatter","version":"2.0.3.0"},{"name":"composer\/ca-bundle","version":"1.2.4.0"},{"name":"embed\/embed","version":"3.4.1.0"},{"name":"ralouphie\/getallheaders","version":"3.0.3.0"},{"name":"psr\/http-message","version":"1.0.1.0"},{"name":"guzzlehttp\/psr7","version":"1.6.1.0"},{"name":"intervention\/image","version":"2.5.0.0"},{"name":"league\/csv","version":"8.2.3.0"},{"name":"league\/flysystem","version":"1.0.55.0"},{"name":"m1\/env","version":"2.1.2.0"},{"name":"marcj\/topsort","version":"1.1.0.0"},{"name":"psr\/log","version":"1.1.0.0"},{"name":"monolog\/monolog","version":"1.24.0.0"},{"name":"nikic\/php-parser","version":"4.2.4.0"},{"name":"paragonie\/random_compat","version":"2.0.18.0"},{"name":"psr\/container","version":"1.0.0.0"},{"name":"symfony\/polyfill-ctype","version":"1.12.0.0"},{"name":"symfony\/yaml","version":"3.4.31.0"},{"name":"symfony\/polyfill-mbstring","version":"1.12.0.0"},{"name":"symfony\/translation","version":"2.8.50.0"},{"name":"symfony\/filesystem","version":"4.3.4.0"},{"name":"symfony\/config","version":"3.4.31.0"},{"name":"symfony\/polyfill-apcu","version":"1.12.0.0"},{"name":"psr\/simple-cache","version":"1.0.1.0"},{"name":"psr\/cache","version":"1.0.1.0"},{"name":"symfony\/cache","version":"3.4.31.0"},{"name":"swiftmailer\/swiftmailer","version":"5.4.12.0"},{"name":"symfony\/finder","version":"3.4.31.0"},{"name":"silverstripe\/config","version":"1.0.16.0"},{"name":"silverstripe\/framework","version":"4.4.3.0"},{"name":"silverstripe\/assets","version":"1.4.3.0"},{"name":"silverstripe-themes\/simple","version":"3.2.0.0"},{"name":"silverstripe\/versioned","version":"1.4.2.0"},{"name":"webonyx\/graphql-php","version":"0.12.6.0"},{"name":"silverstripe\/graphql","version":"3.1.4.0"},{"name":"silverstripe\/admin","version":"1.4.3.0"},{"name":"silverstripe\/versioned-admin","version":"1.2.3.0"},{"name":"silverstripe\/siteconfig","version":"4.4.1.0"},{"name":"silverstripe\/reports","version":"4.4.1.0"},{"name":"silverstripe\/recipe-core","version":"4.4.3.0"},{"name":"silverstripe\/campaign-admin","version":"1.4.1.0"},{"name":"silverstripe\/cms","version":"4.4.3.0"},{"name":"silverstripe\/errorpage","version":"1.4.1.0"},{"name":"silverstripe\/asset-admin","version":"1.4.2.0"},{"name":"silverstripe\/recipe-cms","version":"4.4.3.0"},{"name":"webmozart\/assert","version":"1.5.0.0"},{"name":"phpdocumentor\/reflection-common","version":"1.0.1.0"},{"name":"phpdocumentor\/type-resolver","version":"0.4.0.0"},{"name":"phpdocumentor\/reflection-docblock","version":"4.3.1.0"},{"name":"phpunit\/php-token-stream","version":"2.0.2.0"},{"name":"sebastian\/version","version":"2.0.1.0"},{"name":"sebastian\/resource-operations","version":"1.0.0.0"},{"name":"sebastian\/recursion-context","version":"2.0.0.0"},{"name":"sebastian\/object-enumerator","version":"2.0.1.0"},{"name":"sebastian\/global-state","version":"1.1.1.0"},{"name":"sebastian\/exporter","version":"2.0.0.0"},{"name":"sebastian\/environment","version":"2.0.0.0"},{"name":"sebastian\/diff","version":"1.4.3.0"},{"name":"sebastian\/comparator","version":"1.2.4.0"},{"name":"phpunit\/php-text-template","version":"1.2.1.0"},{"name":"doctrine\/instantiator","version":"1.2.0.0"},{"name":"phpunit\/phpunit-mock-objects","version":"3.4.4.0"},{"name":"phpunit\/php-timer","version":"1.0.9.0"},{"name":"phpunit\/php-file-iterator","version":"1.4.5.0"},{"name":"sebastian\/code-unit-reverse-lookup","version":"1.0.1.0"},{"name":"phpunit\/php-code-coverage","version":"4.0.8.0"},{"name":"phpspec\/prophecy","version":"1.8.1.0"},{"name":"myclabs\/deep-copy","version":"1.9.3.0"},{"name":"phpunit\/phpunit","version":"5.7.27.0"}]}
```
## Pull Requests
* [x] https://github.com/silverstripe/silverstripe-installer/pull/260
* [x] https://github.com/silverstripe/silverstripe-installer/pull/261
* [x] https://github.com/silverstripe/silverstripe-framework/pull/9250
* [x] https://github.com/silverstripe/cow/pull/145
/cc @silverstripe/core-team