/** * Generate a site package and fill it with boilerplate data. * * @param string $packageKey * @param string $siteName * @return array */ public function generateSitePackage($packageKey, $siteName) { $packageMetaData = new MetaData($packageKey); $packageMetaData->addConstraint(new PackageConstraint(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS, 'TYPO3.Neos')); $packageMetaData->addConstraint(new PackageConstraint(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS, 'TYPO3.Neos.NodeTypes')); $packageMetaData->addConstraint(new PackageConstraint(MetaDataInterface::CONSTRAINT_TYPE_SUGGESTS, 'TYPO3.Neos.Seo')); $this->packageManager->createPackage($packageKey, $packageMetaData, null, 'typo3-flow-site'); $this->generateSitesXml($packageKey, $siteName); $this->generateSitesTypoScript($packageKey, $siteName); $this->generateSitesTemplate($packageKey, $siteName); $this->generateNodeTypesConfiguration($packageKey); $this->generateAdditionalFolders($packageKey); return $this->generatedFiles; }
/** * Returns the package meta data object of this package. * * @return \TYPO3\Flow\Package\MetaData */ public function getPackageMetaData() { if ($this->packageMetaData === null) { $this->packageMetaData = new MetaData($this->getPackageKey()); $this->packageMetaData->setDescription($this->getComposerManifest('description')); $this->packageMetaData->setVersion($this->getComposerManifest('version')); $this->packageMetaData->setPackageType($this->getComposerManifest('type')); $requirements = $this->getComposerManifest('require'); if ($requirements !== null) { foreach ($requirements as $requirement => $version) { if ($this->packageRequirementIsComposerPackage($requirement) === false) { // Skip non-package requirements continue; } try { $packageKey = $this->packageManager->getPackageKeyFromComposerName($requirement); } catch (Exception\InvalidPackageStateException $exception) { continue; } $constraint = new MetaData\PackageConstraint(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS, $packageKey); $this->packageMetaData->addConstraint($constraint); } } } return $this->packageMetaData; }
/** * Returns the package meta data object of this package. * Note that since Flow 3.1 the MetaData won't contain any constraints, * please use the composer manifest directly if you need this information. * * @return \TYPO3\Flow\Package\MetaData * @deprecated To be removed in Flow 4.0 */ public function getPackageMetaData() { if ($this->packageMetaData === null) { $this->packageMetaData = new MetaData($this->getPackageKey()); $this->packageMetaData->setDescription($this->getComposerManifest('description')); $this->packageMetaData->setVersion($this->getComposerManifest('version')); $this->packageMetaData->setPackageType($this->getComposerManifest('type')); } return $this->packageMetaData; }
/** * Returns the package meta data object of this package. * * @return \TYPO3\Flow\Package\MetaData */ public function getPackageMetaData() { if ($this->packageMetaData === NULL) { $this->packageMetaData = new MetaData($this->getPackageKey()); $this->packageMetaData->setDescription($this->getComposerManifest('description')); $this->packageMetaData->setVersion($this->getComposerManifest('version')); $requirements = $this->getComposerManifest('require'); if ($requirements !== NULL) { foreach ($requirements as $requirement => $version) { if ($this->packageRequirementIsComposerPackage($requirement) === FALSE) { // Skip non-package requirements continue; } $packageKey = $this->packageManager->getPackageKeyFromComposerName($requirement); $constraint = new MetaData\PackageConstraint(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS, $packageKey); $this->packageMetaData->addConstraint($constraint); } } } return $this->packageMetaData; }
/** * Returns the composer manifest constraints ("require", "suggest" or "conflict") from the given package meta data * * @param string $constraintType one of the MetaDataInterface::CONSTRAINT_TYPE_* constants * @param MetaData $packageMetaData * @return array in the format array('<ComposerPackageName>' => '*', ...) * @deprecated This will be removed with Flow 4.0 together with the MetaData model */ protected function getComposerManifestConstraints($constraintType, MetaData $packageMetaData) { $composerManifestConstraints = []; $constraints = $packageMetaData->getConstraintsByType($constraintType); foreach ($constraints as $constraint) { if (!$constraint instanceof MetaData\PackageConstraint) { continue; } $composerName = isset($this->packageStatesConfiguration['packages'][$constraint->getValue()]['composerName']) ? $this->packageStatesConfiguration['packages'][$constraint->getValue()]['composerName'] : ComposerUtility::getComposerPackageNameFromPackageKey($constraint->getValue()); $composerManifestConstraints[$composerName] = '*'; } return $composerManifestConstraints; }
/** * Generates composer manifest data out of a MetaData object. * * @param string $packageType * @param MetaData|null $packageMetaData * @return array manifest data generated from the MetaData object * @deprecated This method will be removed with Flow 4.0 together with the MetaData model */ protected function generateManifestFromMetaDataAndType($packageType, \TYPO3\Flow\Package\MetaData $packageMetaData = null) { $manifest = ['type' => $packageType, 'description' => 'Add description here', 'require' => ['typo3/flow' => '*']]; if ($packageMetaData === null) { return $manifest; } if ($packageMetaData->getPackageType() !== null) { $manifest['type'] = $packageMetaData->getPackageType(); } $manifest['description'] = $packageMetaData->getDescription() ?: $manifest['description']; if ($packageMetaData->getVersion()) { $manifest['version'] = $packageMetaData->getVersion(); } $dependsConstraints = $this->getComposerManifestConstraints(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS, $packageMetaData); if ($dependsConstraints !== []) { $manifest['require'] = $dependsConstraints; } $suggestsConstraints = $this->getComposerManifestConstraints(MetaDataInterface::CONSTRAINT_TYPE_SUGGESTS, $packageMetaData); if ($suggestsConstraints !== []) { $manifest['suggest'] = $suggestsConstraints; } $conflictsConstraints = $this->getComposerManifestConstraints(MetaDataInterface::CONSTRAINT_TYPE_CONFLICTS, $packageMetaData); if ($conflictsConstraints !== []) { $manifest['conflict'] = $conflictsConstraints; } return $manifest; }
/** * Write a composer manifest for the package. * * @param string $manifestPath * @param string $packageKey * @param MetaData $packageMetaData * @return void */ protected function writeComposerManifest($manifestPath, $packageKey, \TYPO3\Flow\Package\MetaData $packageMetaData = null) { $manifest = array('name' => $this->getComposerPackageNameFromPackageKey($packageKey)); if ($packageMetaData !== null) { $manifest['type'] = $packageMetaData->getPackageType(); $manifest['description'] = $packageMetaData->getDescription() ?: 'Add description here'; if ($packageMetaData->getVersion()) { $manifest['version'] = $packageMetaData->getVersion(); } $dependsConstraints = $this->getComposerManifestConstraints(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS, $packageMetaData); if ($dependsConstraints !== array()) { $manifest['require'] = $dependsConstraints; } $suggestsConstraints = $this->getComposerManifestConstraints(MetaDataInterface::CONSTRAINT_TYPE_SUGGESTS, $packageMetaData); if ($suggestsConstraints !== array()) { $manifest['suggest'] = $suggestsConstraints; } $conflictsConstraints = $this->getComposerManifestConstraints(MetaDataInterface::CONSTRAINT_TYPE_CONFLICTS, $packageMetaData); if ($conflictsConstraints !== array()) { $manifest['conflict'] = $conflictsConstraints; } } else { $manifest['type'] = 'typo3-flow-package'; $manifest['description'] = ''; } if (!isset($manifest['require']) || empty($manifest['require'])) { $manifest['require'] = array('typo3/flow' => '*'); } $manifest['autoload'] = array('psr-0' => array(str_replace('.', '\\', $packageKey) => 'Classes')); if (defined('JSON_PRETTY_PRINT')) { file_put_contents(Files::concatenatePaths(array($manifestPath, 'composer.json')), json_encode($manifest, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); } else { file_put_contents(Files::concatenatePaths(array($manifestPath, 'composer.json')), json_encode($manifest)); } }
/** * Write a composer manifest for the package. * * @param string $manifestPath * @param string $packageKey * @param MetaData $packageMetaData * @return void */ protected function writeComposerManifest($manifestPath, $packageKey, \TYPO3\Flow\Package\MetaData $packageMetaData = NULL) { $manifest = array(); $nameParts = explode('.', $packageKey); $vendor = array_shift($nameParts); $manifest['name'] = strtolower($vendor . '/' . implode('-', $nameParts)); if ($packageMetaData !== NULL) { $manifest['type'] = $packageMetaData->getPackageType(); $manifest['description'] = $packageMetaData->getDescription(); $manifest['version'] = $packageMetaData->getVersion(); } else { $manifest['type'] = 'typo3-flow-package'; $manifest['description'] = ''; } $manifest['require'] = array('typo3/flow' => '*'); $manifest['autoload'] = array('psr-0' => array(str_replace('.', '\\', $packageKey) => 'Classes')); if (defined('JSON_PRETTY_PRINT')) { file_put_contents(Files::concatenatePaths(array($manifestPath, 'composer.json')), json_encode($manifest, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); } else { file_put_contents(Files::concatenatePaths(array($manifestPath, 'composer.json')), json_encode($manifest)); } }
/** * Create a package, given the package key * * @param string $packageKey The package key of the new package * @param \TYPO3\Flow\Package\MetaData $packageMetaData If specified, this package meta object is used for writing the Package.xml file, otherwise a rudimentary Package.xml file is created * @param string $packagesPath If specified, the package will be created in this path, otherwise the default "Application" directory is used * @param string $packageType If specified, the package type will be set, otherwise it will default to "typo3-flow-package" * @return \TYPO3\Flow\Package\PackageInterface The newly created package * @throws \TYPO3\Flow\Package\Exception * @throws \TYPO3\Flow\Package\Exception\PackageKeyAlreadyExistsException * @throws \TYPO3\Flow\Package\Exception\InvalidPackageKeyException * @api */ public function createPackage($packageKey, \TYPO3\Flow\Package\MetaData $packageMetaData = NULL, $packagesPath = NULL, $packageType = 'typo3-flow-package') { if (!$this->isPackageKeyValid($packageKey)) { throw new \TYPO3\Flow\Package\Exception\InvalidPackageKeyException('The package key "' . $packageKey . '" is invalid', 1220722210); } if ($this->isPackageAvailable($packageKey)) { throw new \TYPO3\Flow\Package\Exception\PackageKeyAlreadyExistsException('The package key "' . $packageKey . '" already exists', 1220722873); } if ($packagesPath === NULL) { if (is_array($this->settings['package']['packagesPathByType']) && isset($this->settings['package']['packagesPathByType'][$packageType])) { $packagesPath = $this->settings['package']['packagesPathByType'][$packageType]; } else { $packagesPath = 'Application'; } $packagesPath = Files::getUnixStylePath(Files::concatenatePaths(array($this->packagesBasePath, $packagesPath))); } if ($packageMetaData === NULL) { $packageMetaData = new MetaData($packageKey); } if ($packageMetaData->getPackageType() === NULL) { $packageMetaData->setPackageType($packageType); } $packagePath = Files::concatenatePaths(array($packagesPath, $packageKey)) . '/'; Files::createDirectoryRecursively($packagePath); foreach (array(PackageInterface::DIRECTORY_METADATA, PackageInterface::DIRECTORY_CLASSES, PackageInterface::DIRECTORY_CONFIGURATION, PackageInterface::DIRECTORY_DOCUMENTATION, PackageInterface::DIRECTORY_RESOURCES, PackageInterface::DIRECTORY_TESTS_UNIT, PackageInterface::DIRECTORY_TESTS_FUNCTIONAL) as $path) { Files::createDirectoryRecursively(Files::concatenatePaths(array($packagePath, $path))); } $this->writeComposerManifest($packagePath, $packageKey, $packageMetaData); $packagePath = str_replace($this->packagesBasePath, '', $packagePath); $package = $this->packageFactory->create($this->packagesBasePath, $packagePath, $packageKey, PackageInterface::DIRECTORY_CLASSES); $this->packages[$packageKey] = $package; foreach ($this->packages as $upperCamelCasedPackageKey => $_) { $this->packageKeys[strtolower($upperCamelCasedPackageKey)] = $upperCamelCasedPackageKey; } $this->activatePackage($packageKey); return $package; }
/** * Write a composer manifest for the package. * * @param string $manifestPath * @param string $packageKey * @param MetaData $packageMetaData * @return void */ protected function writeComposerManifest($manifestPath, $packageKey, \TYPO3\Flow\Package\MetaData $packageMetaData = NULL) { $manifest = array(); $nameParts = explode('.', $packageKey); $vendor = array_shift($nameParts); $manifest['name'] = strtolower($vendor . '/' . implode('-', $nameParts)); if ($packageMetaData !== NULL) { $manifest['type'] = $packageMetaData->getPackageType(); $manifest['description'] = $packageMetaData->getDescription() ?: 'Add description here'; if ($packageMetaData->getVersion()) { $manifest['version'] = $packageMetaData->getVersion(); } $manifest['require'] = array(); $dependencies = $packageMetaData->getConstraintsByType(MetaDataInterface::CONSTRAINT_TYPE_DEPENDS); foreach ($dependencies as $dependencyConstraint) { if ($dependencyConstraint instanceof \TYPO3\Flow\Package\MetaData\PackageConstraint) { if (isset($this->packageStatesConfiguration['packages'][$dependencyConstraint->getValue()]['composerName'])) { $manifest['require'][$this->packageStatesConfiguration['packages'][$dependencyConstraint->getValue()]['composerName']] = '*'; } } } } else { $manifest['type'] = 'typo3-flow-package'; $manifest['description'] = ''; } if (!isset($manifest['require']) || empty($manifest['require'])) { $manifest['require'] = array('typo3/flow' => '*'); } $manifest['autoload'] = array('psr-0' => array(str_replace('.', '\\', $packageKey) => 'Classes')); if (defined('JSON_PRETTY_PRINT')) { file_put_contents(Files::concatenatePaths(array($manifestPath, 'composer.json')), json_encode($manifest, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); } else { file_put_contents(Files::concatenatePaths(array($manifestPath, 'composer.json')), json_encode($manifest)); } }