在其他目录中运行操作

294

我刚开始探索 Github actions,但发现自己需要在多个位置输入命令。

我的 PHP 项目中,composer.json 不在根目录下,我的结构如下:

my-project:
    readme.md
    app:
        composer.json

显然其中还有更多的内容和原因,但我的 composer.json 位于名为“app”的子目录中。因此,在我的工作流程中,每次运行一个命令都必须进入那个文件夹:

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Setup Symfony
        run: |
          cd app
          cp .env.dev .env
      - name: Install Composer Dependencies
        run: |
          cd app
          composer install --prefer-dist
      - name: Run Tests
        run: |
          cd app
          php bin/phpunit

我如何在每个阶段中删除cd app

3个回答

398

更新: 现在可以为一个作业(job)设置默认working-directory。请参见此答案

有一种方法可以在步骤(step)中设置working-directory,但无法为多个步骤或整个作业(job)设置。我相当确信这个选项只适用于具有uses的操作步骤而非脚本(script)步骤。

https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsrun

使用working-directory,您的工作流将如下所示。它仍然相当冗长,但可能会更加简洁。

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Setup Symfony
        working-directory: ./app
        run: cp .env.dev .env
      - name: Install Composer Dependencies
        working-directory: ./app
        run: composer install --prefer-dist
      - name: Run Tests
        working-directory: ./app
        run: php bin/phpunit

或者,您可以一步完成所有操作,这样您只需要一次指定working-directory

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Setup and run tests
        working-directory: ./app
        run: |
          cp .env.dev .env
          composer install --prefer-dist
          php bin/phpunit

1
在不同的步骤中设置不同的“工作目录”是否可行? - idkman
1
@idkman 是的,你可以将 working-directory: ./app 添加到每个步骤中。这正是这个答案所讲述的 :) - Pfinnn
如果您正在使用uses,例如UploadArtifact操作,那么对于这种边缘情况有什么解决方案? - Kay

311

现在您可以为作业中的所有步骤添加默认工作目录:文档

对于此处的示例,它将是:

name: CI

on: [push]

jobs:
  phpunit:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./app
    steps:
      - uses: actions/checkout@v1
      - name: Setup Symfony
        run: .env.dev .env
      - name: Install Composer Dependencies
        run: composer install --prefer-dist
      - name: Run Tests
        run: php bin/phpunit

注意:这仅适用于run步骤;例如,如果需要,您仍需将子目录添加到uses步骤的with参数中。


42
你知道如何在使用 uses 时指定工作目录 working-directory 吗?正如你所提到的,你有使用 withuses 的示例吗?谢谢。 - theprogrammer
1
你使用哪个 uses 操作,并且它是否有任何需要指定路径的参数(使用 with)?如果是这样,请使用相对于默认根目录而不是 default.run.working-directory 给出这些路径。 - Tomas
4
如果你使用 uses,那么包的作者必须明确支持 working-directory 或者为他们的目的和上下文实现类似的功能。据我所见,大多数包都没有这样做。 - perelin
1
我们可以在工作目录中使用变量吗,例如./app/$SOME_DIR? - Sufiyan Ansari
对于 FirebaseHosting 推送,您可以在 with: 后面添加以下字段 entryPoint: "./someDirectory" - JoKr

78

希望这能对某人有所帮助

name: CI

on:
 ...

defaults:
 run:
  working-directory: ./app

jobs:
 ...

1
谢谢你,你救了我的一天,因为之前的答案对我没有用。 - a_sarana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接