为 Firebase 托管设置 Github 操作时找不到 package.json 文件

Couldn't find a package.json file when setting up Github actions for Firebase Hosting

在为 firebase 托管初始化 github 操作时,我指定了以下内容:

在每次部署之前将工作流程设置为 运行 构建脚本?是的 每次部署前应该 运行 什么脚本?纱线 运行 构建。

这个工作流程给我错误

Run yarn run build
yarn run v1.22.10
error Couldn't find a package.json file in "/home/runner/work/SpaceBar/SpaceBar"
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Error: Process completed with exit code 1.

我的项目目录中有一个 package.json 文件。为什么说找不到?

firebase-hosting-merge.yml 位于名为 spacebar 的目录中,该目录包含另一个名为 spacebar 的目录,其中包含 package.json 文件。 反正有没有cd到这个文件的子目录

name: Deploy to Firebase Hosting on merge
'on':
  push:
    branches:
      - main
jobs:
  build_and_deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: yarn run build
      - uses: FirebaseExtended/action-hosting-deploy@v0

由于 actions/checkout 操作使您可以访问存储库文件和目录,因此您可以 cd 进入 package.json 文件所在的目录,然后再执行 [=14] =] 命令。否则,它只会在存储库根目录中查找它。

示例(针对您的第二步)

run: |
   cd spacebar/spacebar
   yarn run build

我在类似的设置中遇到了同样的错误。不幸的是,标记为已接受的答案并没有解决我的问题。

然而,经过大量谷歌搜索后,我确实设法解决了我的问题,只是想分享我发现的内容,以防其他人仍然遇到我遇到的问题:

正如 GuiFalourd 正确提到的那样,错误是要求您进入 package.json 文件所在的目录。但事实证明,有多种方法可以做到这一点——有些方法比其他方法更正确。在我的具体情况下,我正在使用的操作和其中的所有命令 运行ning 都应该在特定目录中 运行 ,因此我选择使用关键字 [= 声明目录13=] 在 defaults 设置中:

name: Build & deploy

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./frontend
    
    strategy:
      matrix:
        node-version: [12.x]
steps:
    - uses: actions/checkout@v1
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
        
    - name: Clean Cache
      run: |
        npm cache clean --force
    - name: CI Install
      run: |
        npm ci
    - name: NPM Install
      run: |
        npm install      
    - name: Production Build
      run: |
        npm run build
      env:
        CI: false
    - name: Unit Tests
      run: |
        npm run test --passWithNoTests

另一种可行的替代方法是在每个步骤中使用命令设置 working-directory。如果您想 运行 特定目录中的特定命令一次,而其他所有内容都在其他地方 运行 ,这可能很有用。缺点是它看起来很乱并且是多余的,如果一切都意味着 运行 在同一个目录中的话:

name: Build & deploy

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        node-version: [12.x]
        
    steps:
    - uses: actions/checkout@v1
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
        
    - name: Clean Cache
      working-directory: ./frontend
      run: |
        npm cache clean --force
    - name: CI Install
      working-directory: ./frontend
      run: |
        npm ci
    - name: NPM Install
      working-directory: ./frontend
      run: |
        npm install      
    - name: Production Build
      working-directory: ./frontend
      run: |
        npm run build
      env:
        CI: false
    - name: Unit Tests
      working-directory: ./frontend
      run: |
        npm run test --passWithNoTests

请注意: working-directory 关键字对 useswith 关键字不起作用。根据您使用的部署操作,您必须在其自己的 env 设置中进行设置。

就我而言,我最终的 YML 文件如下所示:

name: Build & deploy

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./frontend
    
    strategy:
      matrix:
        node-version: [12.x]
        
    steps:
    - uses: actions/checkout@v1
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
        
    - name: Clean Cache
      run: |
        npm cache clean --force
    - name: CI Install
      run: |
        npm ci
    - name: NPM Install
      run: |
        npm install      
    - name: Production Build
      run: |
        npm run build
      env:
        CI: false
    - name: Unit Tests
      run: |
         npm run test --passWithNoTests
    - name: Deploy to S3
      uses: jakejarvis/s3-sync-action@master
      with:
        args: --acl public-read --delete
      env:
        AWS_S3_BUCKET: ${{ secrets.AWS_PRODUCTION_BUCKET_NAME }}
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
        SOURCE_DIR: "./frontend/build"

希望这对您有所帮助。