使用 laravel 函数构建 gradle assemble apk

Build gradle assemble apk using laravel function

我目前正在 larval 函数中调用主 python 文件,在主 python 文件中我正在调用另外 2 个文件(PowerShell 和子 python 文件)问题是当 Laravel 函数被触发时它只调用主 python 文件,但是当我使用终端调用主 python 文件时,所有文件的执行如下:

Laravel 函数:

public function initialize(Request $request)
{
    $store_name = $request->get('store_name', 1);
    if (empty($store_name)) {
        return 'Missing store name';
    } else {
        $processes = File::get("/root/flask/android_api/processes.txt");
            File::put('/root/flask/android_api/url.txt', $store_name );
            $process = new Process(['python3.6', '/root/flask/android_api/buildAPK.py']);
            $process->run();
            if (!$process->isSuccessful()) {
                    throw new ProcessFailedException($process);
            } else {
                    return 'Starting the processes to build';
            }   
    } 
}

在主 python 文件中我有:

try:
    p = subprocess.Popen(["/usr/bin/pwsh", 
            "/root/flask/android_api/set_apk_builder.ps1", '-ExecutionPolicy',
                        'Unrestricted',
                        './buildxml.ps1'], 
            stdout=sys.stdout)
    p.communicate()

except:
    file = open ("/root/flask/android_api/log.txt", "w")
    file.write ("fail")
    file.close()


import slack
  //  call(["python", "/root/flask/flask.py"])
    os.system('python3.7 /root/flask/flask.py')

编辑:

现在我将构建更改为直接从 laravel 函数生成 apk 使用此命令:

public function initialize(Request $request)
{
    $store_name = $request->get('store_name', 1);
    if (empty($store_name)) {
        return 'Missing store name';
    } else {
            return shell_exec('cd /var/www/html/androidProject && chmod +x gradlew && ./gradlew assembledemoDebug');
    }
     
}

但是,命令行 returns Gradle 命令构建正在启动,但它不会创建文件夹并生成 apk

当前文件夹结构 /var/www/html 里面 html 是项目文件夹和 laravel 项目

注意:在 Laravel 函数中调用 Gradle 构建命令之前,我曾经调用 python 文件并且 python 文件正在调用 Gradle命令,但我有同样的问题,未创建 apk,但是当我 运行 来自 bash 命令的相同 python 文件时,它工作正常

您可以通过两种方式完成此操作:

首先是将您的命令包含到一个 .sh 文件中,您应该使用此命令使其可执行:

chmod +x file.sh

然后您应该使用 Symfony 进程从 laravel 调用该文件,以便您可以获得日志进程和错误的详细信息:

use Symfony\Component\Process\Process; use Symfony\Component\Process\Exception\ProcessFailedException;

$process = new Process('sh /folder_name/file_name.sh');

$process->run();
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}
echo $process->getOutput();

然后在该文件中包含您希望 运行 的所有命令。

其次你可以运行这些命令使用

$output = shell_exec('ls -lart');
then echo "<pre>$output</pre>";

您需要将所有可写文件移动到 Laravel 中的 public 目录,因为那是所有内容都应该可编辑的地方。'=

实际上我建议第一个,因为您不需要将某些文件夹的所有者更改为 www-data 来授予写入权限。