如何从 symfony 项目制作 'npm run build'

How to make a 'npm run build' from a symfony project

我目前有一个使用 Foundation for Emails 来创建响应式电子邮件的 symfony 项目。

Foundation 框架使用命令'npm run build' 来转换文件。我尝试使用进程 class 做一个服务来解析我的内容,但我一定是用错了,因为它不执行 'npm run build'。这是我的错误代码:

<?php
/**
 * Created by PhpStorm.
 * User: jeremie
 * Date: 28/12/17
 * Time: 16:59
 */

namespace Acme\Open4XMLParserBundle\Services;

use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Process\Process;


/**
 * @todo : code this
 */
class FoundationParser
{
    protected $foundationLocation;
    protected $process;

    /**
     * FoundationParser constructor.
     * @param $foundationLocation
     */
    public function __construct($foundationLocation)
    {
        $this->foundationLocation = $foundationLocation;
        $this->process = new Process('npm run build', $this->foundationLocation);
    }

    /**
     * Run npm run build if needed
     */
    public function initFoundation()
    {
        //make sure that 'npm run build' is running and execute it if not
        if (!$this->process->isRunning()) {
            $this->process->start();
        }
    }

    public function saveFoundationContent($foundationContent, $filename)
    {
        //save the file in foundation/src/pages
        $fileSystem = new Filesystem();
        $fileLocation = $this->foundationLocation . '/src/pages/' . $filename;
        if (!$fileSystem->exists($fileLocation)) {
            $fileSystem->dumpFile($fileLocation, $foundationContent);
            $fileSystem->chmod($fileLocation, 0664);
        }
    }

    public function retrieveValidHtml($fileName)
    {
        $fileLocation = $this->foundationLocation . '/dist/' . $fileName;
        while (true) {
            try {
                $result = file_get_contents($fileLocation);
                if ($result !== false){
                    return $result;
                }
            } catch (\Exception $e) {

            }
        }
    }
}

我这样使用我的服务:

$foundationParser = $this->container->get('open4xmlparser.foundationparser');
$foundationParser->initFoundation();
$foundationParser->saveFoundationContent($foundationContent, 'test.html');
$response = new Response($foundationParser->retrieveValidHtml('test.html'));
$response->headers->set('Content-Type', 'text/html');
$response->send();

它告诉我 'test.html' 不存在。知道如何做我想做的事吗?

目标文件的 saveFoundationContentretrieveValidHtml 路径似乎不同。

// saveFoundationContent()
$fileLocation = $this->foundationLocation . '/src/pages/' . $filename;

// retrieveValidHtml()
$fileLocation = $this->foundationLocation . '/dist/' . $fileName;

显然,retrieveValidHtml()无法在该位置找到文件。

提示:将子目录路径存储为class变量(或常量):

class FoundationParser
{
    private $subdir = "/dist/"; // or "/src/pages/";

    … 

    public function retrieveValidHtml($fileName)
    {
        $fileLocation = sprintf("%s%s%s", $this->foundationLocation, $this->subdir, $fileName);
        …
    }
}

我最终决定做的是一个 Symfony 命令,它在无限循环中启动我的程序(它永远不会停止)。我没有使用服务,而是直接在 while 循环中执行了 'npm run build'。

protected function execute(InputInterface $input, OutputInterface $output)
{
    $output->writeln([
        '',
        'Running program',
        '===============',
        ''
    ]);
    $runBuild = new Process('npm run build', $this->getContainer()->getParameter('foundation_location'));

    while (true) {

        if (!$runBuild->isRunning()){
            $output->writeln([
                '',
                'Executing npm run build',
                ''
            ]);
            $runBuild->start();
        }
    }
}