6

我的问题是如何从 CakePHP 3.0 的供应商文件夹中加载 .js 文件。我已经通过作曲家包含了 twitter 引导程序。.js 文件位于 /vendor/twbs/bootstrap-sass/assets/javascripts/ 文件夹中。我不想将它移动到 webroot,因为那样我会破坏 composer 提供的自动更新功能。有什么好的建议吗?我不想复制文件并失去作曲家的好处......

4

3 回答 3

6

我找到了解决方案!如果我正在使用作曲家,为什么不使用它呢,对吧?:)

在 composer.json 中:

"scripts": {
    "post-install-cmd": "App\\Console\\Installer::postInstall",
    "post-update-cmd": "App\\Console\\Installer::postUpdate"
}

在 src/Console/Installer.php 中:

public static function postUpdate(Event $event) {
    $io = $event->getIO();

    $rootDir = dirname(dirname(__DIR__));

    static::copyTwitterBootstrapFiles($rootDir, $io);
}

public static function copyTwitterBootstrapFiles($dir, $io) {

    $bootstrapJsSource = $dir . '/vendor/twbs/bootstrap-sass/assets/javascripts/bootstrap.js';
    $bootstrapJsDestination = $dir . '/webroot/js/bootstrap.js';

    if (file_exists($bootstrapJsSource)) {
        copy($bootstrapJsSource, $bootstrapJsDestination);
        $io->write('Copied `bootstrap.js` file');
    }

}

最后,如果您使用 git,请将 webroot/bootstrap.js 添加到 .gitignore。postUpdate 在每个 composer update 命令之后运行,因此如果您想在每次实际包更新后运行脚本,只需使用 post-package-update 而不是 post-update-cmd。

于 2014-11-04T14:30:17.420 回答
1

与 mutdsu 的答案相同,但有更多细节。

在 composer.json 中的 scripts 下,添加以下行:

"post-update-cmd": "App\\Console\\Installer::postUpdate",

它应该显示如下内容:

"scripts": {
    ...
    "post-update-cmd": "App\\Console\\Installer::postUpdate",
    ...
},

在 src/Console/Installer.php 中,添加这两个静态函数:

public static function postUpdate(Event $event) {
    $io = $event->getIO();
    $rootDir = dirname(dirname(__DIR__));
    static::copyBootstrapAssets($rootDir, $io);
}

public static function copyBootstrapAssets($dir, $io) {
    $ds = DIRECTORY_SEPARATOR;
    $bootstrapAssetsDir = $dir . $ds . 'vendor' . $ds . 'twbs' . $ds . 'bootstrap' . $ds . 'dist' . $ds;
    $bootstrapCssAssetsDir = $bootstrapAssetsDir . 'css' . $ds;
    $bootstrapJsAssetsDir = $bootstrapAssetsDir . 'js' . $ds;
    $bootstrapFontAssetsDir = $bootstrapAssetsDir . 'fonts' . $ds;
    $webrootDir = $dir . $ds . 'webroot' . $ds;
    $cssDir = $webrootDir . 'css' . $ds;
    $jsDir = $webrootDir . 'js' . $ds;
    $fontDir = $webrootDir . 'fonts' . $ds;
    if (!file_exists($cssDir) && !is_dir($cssDir)) {
        mkdir($cssDir);
    }
    if (!file_exists($jsDir) && !is_dir($jsDir)) {
        mkdir($jsDir);
    }
    if (!file_exists($fontDir) && !is_dir($fontDir)) {
        mkdir($fontDir);
    }
    $cssAssets = [
        'bootstrap.min.css',
        'bootstrap-theme.min.css',
    ];
    $jsAssets = [
        'bootstrap.min.js',
    ];
    $fontAssets = [
        'glyphicons-halflings-regular.eot',
        'glyphicons-halflings-regular.svg',
        'glyphicons-halflings-regular.ttf',
        'glyphicons-halflings-regular.woff',
        'glyphicons-halflings-regular.woff2',
    ];
    foreach ($cssAssets as $asset) {
        if (file_exists($bootstrapCssAssetsDir . $asset)) {
            copy($bootstrapCssAssetsDir . $asset, $cssDir . $asset);
            $io->write('Copied `' . $asset . '` file');
        } else {
            if (file_exists($cssDir . $asset)) {
                unlink($cssDir . $asset);
            }
        }
    }
    foreach ($jsAssets as $asset) {
        if (file_exists($bootstrapJsAssetsDir . $asset)) {
            copy($bootstrapJsAssetsDir . $asset, $jsDir . $asset);
            $io->write('Copied `' . $asset . '` file');
        } else {
            if (file_exists($jsDir . $asset)) {
                unlink($jsDir . $asset);
            }
        }
    }
    foreach ($fontAssets as $asset) {
        if (file_exists($bootstrapFontAssetsDir . $asset)) {
            copy($bootstrapFontAssetsDir . $asset, $fontDir . $asset);
            $io->write('Copied `' . $asset . '` file');
        } else {
            if (file_exists($fontDir . $asset)) {
                unlink($fontDir . $asset);
            }
        }
    }
}

如果您使用的是 git,请确保将这些行添加到您的 .gitignore 文件中:

/webroot/css/bootstrap.min.css
/webroot/css/bootstrap-theme.min.css
/webroot/js/bootstrap.min.js
/webroot/fonts/glyphicons-halflings-regular.eot
/webroot/fonts/glyphicons-halflings-regular
/webroot/fonts/glyphicons-halflings-regular.ttf
/webroot/fonts/glyphicons-halflings-regular.woff
/webroot/fonts/glyphicons-halflings-regular.woff2
/webroot/fonts/glyphicons-halflings-regular.woff2
于 2016-10-02T18:07:21.520 回答
0

我不喜欢复制文件,所以根据以前的答案,我创建了创建引导文件链接的函数。请注意,对于 Bootstrap4,它现在没有字体分发。

/**
 * Create Bootstrap4 assets links
 *
 * @param string $dir The application's root directory.
 * @param \Composer\IO\IOInterface $io IO interface to write to console.
 * @return void
 */

public static function createBootstrapLinks($dir, $io) {
    $ds = DIRECTORY_SEPARATOR;
    if (!file_exists($dir . $ds . 'vendor' . $ds . 'twbs' . $ds . 'bootstrap'))
    {
        $io->write('Bootstrap is not installed. Include Bootstrap into project: composer require twbs/bootstrap');
        return;
    }
    $bootstrapAssetsDir = realpath($dir . $ds . 'vendor' . $ds . 'twbs' . $ds . 'bootstrap' . $ds . 'dist');
    $bootstrapAssets = [
        'css' => $bootstrapAssetsDir . $ds . 'css' . $ds,
        'js' => $bootstrapAssetsDir . $ds . 'js' . $ds
    ];
    $webrootDir = realpath($dir . $ds . 'webroot');

    $webrootPathes = [
        'css' => $webrootDir . $ds . 'css' . $ds . 'bootstrap',
        'js' => $webrootDir . $ds . 'js' . $ds . 'bootstrap'
    ];

    foreach ($bootstrapAssets as $type => $asset)
    {
        if (!file_exists($asset))
        {
            $io->write('Asset `' . $asset . '` does not exists. Unable to create link.');
            continue;
        }
        $name = isset($webrootPathes[$type]) ? $webrootPathes[$type] : ($webrootDir . $type . $ds . 'bootstrap');
        if (file_exists($name))
        {
            switch(filetype($name))
            {
                case 'link':
                    $link_target = readlink($name);
                    if ($link_target == $asset)
                    {
                        $io->write('Correct link to `' . $asset . '` already exists. Fine.');
                    }
                    else
                    {
                        $io->write('Link `' . $name . '` already exists and points to `'. $link_target .'`. Unable to create link.');
                    }
                    break;
                case 'dir':
                    $io->write('Dir `' . $name . '` already exists. Unable to create link.');
                    break;
                default:
                    $io->write(filetype($name).' `' . $name . '` already exists. Unable to create link.');
                    break;
            }
        }
        else
        {
            $io->write('Link `' . $name . '` to `' . $asset . '` created. Fine.');
            symlink($asset, $name);
        }
    }
}
于 2019-08-14T14:26:36.343 回答