我想从Composer安装此软件包后复制一个位于软件包内的文件。
实际上,我希望在从Composer安装或更新软件包后,将一些可能在下载软件包中的文件复制到另一个目录中。我使用scripts和post-package-install和post-package-update命令,但是我找不到如何获取安装路径。
这是我目前的剧本:
use Composer\Script\PackageEvent;
class MyScript {
public static function copyFiles(PackageEvent $event)
{
$package = $event->getOperation()->getPackage();
$originDir = $package->someFunctionToFind(); #Here, I should retrieve the install dir
if (file_exists($originDir) && is_dir($originDir)) {
//copy files from $originDir to a new location
}
}
}
有人知道如何从PackageEvent类(参数中提供)获取已安装/更新的软件包的安装目录吗?
注意:
我试过$event->getOperation()->getPackage->targetDir()
,但这不提供安装路径,而是targetDir of the package, defined in composer.json
答案 0 :(得分:6)
我可以使用Composer\Installation\InstallationManager::getInstallPath方法获取安装路径。
理论回答:
use Composer\Script\PackageEvent;
class MyScript {
public static function copyFiles(PackageEvent $event)
{
$package = $event->getOperation()->getPackage();
$installationManager = $event->getComposer()->getInstallationManager();
$originDir = $installationManager->getInstallPath($package);
if (file_exists($originDir) && is_dir($originDir)) {
//copy files from $originDir to a new location
}
}
}
但是这个答案是理论上的,因为在没有真正安装软件包的情况下我找不到调试我的代码的解决方案(这很痛苦:我应该删除一个软件包,并重新安装它来检查我的代码)。
所以我切换到post-install-cmd和post-update-cmd,然后我变成了:
use Composer\Script\CommandEvent; #the event is different !
class MyScript {
public static function copyFiles(CommandEvent $event)
{
// wet get ALL installed packages
$packages = $event->getComposer()->getRepositoryManager()
->getLocalRepository()->getPackages();
$installationManager = $event->getComposer()->getInstallationManager();
foreach ($packages as $package) {
$installPath = $installationManager->getInstallPath($package);
//do my process here
}
}
}
不要忘记将命令添加到composer.json:
"scripts": {
"post-install-cmd": [
"MyScript::copyFiles"
],
"post-update-cmd": [
"MyScript::copyFiles"
]
}
要调试代码,我必须运行composer.phar run-script post-install-cmd。
注意:此代码适用于psr4。对于psr0,可能需要添加$ package-> targetDir()以获取正确的安装路径。随意评论或改进我的答案。