diff --git a/.github/actions/run_and_upload_unit_tests/action.yml b/.github/actions/run_and_upload_unit_tests/action.yml index e8f2606e..d72df749 100644 --- a/.github/actions/run_and_upload_unit_tests/action.yml +++ b/.github/actions/run_and_upload_unit_tests/action.yml @@ -14,19 +14,19 @@ runs: - name: Cache ${{ inputs.package-name }} virtualenv uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - path: ./${{ inputs.package-basepath }}/${{ inputs.package-name }}/.venv + path: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }}/.venv key: ${{ inputs.package-name }}-${{ runner.os }}-py${{ env.pythonVersion }}-${{ hashFiles(format('{0}/{1}/poetry.lock', inputs.package-basepath, inputs.package-name)) }} - name: Install ${{ inputs.package-name }} run: poetry install -v - working-directory: ./${{ inputs.package-basepath }}/${{ inputs.package-name }} + working-directory: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }} shell: bash - name: Run ${{ inputs.package-name }} unit tests and code coverage run: poetry run pytest ./tests/unit -v --cov=${{ inputs.package-name }} --junitxml=test_results/${{ inputs.package-name }}-${{ matrix.os }}-py${{ matrix.python-version }}.xml - working-directory: ./${{ inputs.package-basepath }}/${{ inputs.package-name }} + working-directory: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }} shell: bash - name: Upload ${{ inputs.package-name }} test results uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: test_results_unit_${{ inputs.package-name }}_${{ matrix.os }}_py${{ matrix.python-version }} - path: ./${{ inputs.package-basepath }}/${{ inputs.package-name }}/test_results/*.xml - if: always() \ No newline at end of file + path: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }}/test_results/*.xml + if: always() diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 861f3213..6ce93b0f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -21,22 +21,16 @@ jobs: uses: ./.github/workflows/check_package.yml with: package-name: ${{ matrix.package-name }} - check_analyzers_grpc_gen: - name: Check analyzers for grpc_generator - uses: ./.github/workflows/check_analyzers.yml - with: - package-name: grpc_generator - package-base-path: tools run_unit_tests: name: Run unit tests uses: ./.github/workflows/run_unit_tests.yml - needs: [check_package, check_analyzers_grpc_gen] + needs: check_package report_test_results: name: Report test results uses: ./.github/workflows/report_test_results.yml - needs: [run_unit_tests] + needs: run_unit_tests if: always() permissions: contents: read checks: write - pull-requests: write \ No newline at end of file + pull-requests: write diff --git a/.github/workflows/check_analyzers.yml b/.github/workflows/check_analyzers.yml index b35c09fc..2b855913 100644 --- a/.github/workflows/check_analyzers.yml +++ b/.github/workflows/check_analyzers.yml @@ -4,20 +4,20 @@ on: workflow_call: inputs: package-name: - description: 'The name of the package to check.' + description: 'The name of the package folder to check.' default: '' required: true type: string - package-base-path: - description: 'The parent directory of the package to check. Defaults to packages.' - default: 'packages' - required: false + package-basepath: + description: 'The base path of the package to check, relative to the repo root.' + default: '' + required: true type: string - install-drivers: - description: 'Whether to install drivers extras' - default: false + install-extras: + description: 'A space-separated list of package extras to install.' + default: '' required: false - type: boolean + type: string jobs: check_analyzers: @@ -26,7 +26,7 @@ jobs: defaults: run: # Set the working-directory for all steps in this job. - working-directory: ./${{ inputs.package-base-path }}/${{ inputs.package-name }} + working-directory: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }} steps: - name: Check out repo uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -42,12 +42,12 @@ jobs: - name: Cache virtualenv uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - path: ${{ inputs.package-base-path }}/${{ inputs.package-name }}/.venv - key: ${{ inputs.package-name }}-${{ runner.os }}-py${{ steps.setup-python.outputs.python-version }}-${{ hashFiles(format('{0}/{1}/poetry.lock', inputs.package-base-path, inputs.package-name)) }} + path: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }}/.venv + key: ${{ inputs.package-name }}-${{ runner.os }}-py${{ steps.setup-python.outputs.python-version }}-${{ hashFiles(format('{0}/{1}/poetry.lock', inputs.package-basepath, inputs.package-name)) }} - name: Install ${{ inputs.package-name }} run: | - if [ "${{ inputs.install-drivers }}" = "true" ]; then - poetry install -v --extras drivers + if [ -n "${{ inputs.install-extras }}" ]; then + poetry install -v --extras '${{ inputs.install-extras }}' else poetry install -v fi @@ -66,10 +66,10 @@ jobs: with: python-platform: Linux version: PATH - working-directory: ./${{ inputs.package-base-path }}/${{ inputs.package-name }} + working-directory: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }} - name: Pyright static analysis (Windows) uses: jakebailey/pyright-action@6cabc0f01c4994be48fd45cd9dbacdd6e1ee6e5e # v2.3.3 with: python-platform: Windows version: PATH - working-directory: ./${{ inputs.package-base-path }}/${{ inputs.package-name }} + working-directory: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }} diff --git a/.github/workflows/check_codegen.yml b/.github/workflows/check_codegen.yml index f5e2d22d..83ee069f 100644 --- a/.github/workflows/check_codegen.yml +++ b/.github/workflows/check_codegen.yml @@ -4,25 +4,25 @@ on: workflow_call: inputs: package-name: - description: 'The name of the package to check.' + description: 'The name of the package folder to check.' default: '' required: true type: string proto-basepath: - description: 'The base path for proto files used for generation.' - default: './third_party/ni-apis' + description: 'The base path to the proto files used for generation, relative to the repo root.' + default: 'third_party/ni-apis' type: string proto-subpath: - description: 'The path to proto files relative to proto-base-path.' + description: 'The specific subpath to the proto files needed for generation, relative to the proto-basepath.' default: '' required: true type: string proto-include-path: - description: 'Additional path to include in the proto generation.' - default: './third_party/ni-apis' + description: 'Additional path to include during proto generation, relative to the repo root.' + default: 'third_party/ni-apis' type: string output-basepath: - description: 'The base output path for codegened files.' + description: 'The base output path for the generated files, relative to the repo root.' default: '' required: true type: string @@ -39,7 +39,7 @@ jobs: defaults: run: # Set the working-directory for all steps in this job. - working-directory: ./tools/grpc_generator + working-directory: ${{ github.workspace }}/tools/grpc_generator steps: - name: Validate package name if: ${{ !endsWith(inputs.package-name, '.proto') && inputs.package-name != 'ni.protobuf.types' }} @@ -58,7 +58,7 @@ jobs: - name: Cache virtualenv uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - path: tools/grpc_generator/.venv + path: ${{ github.workspace }}/tools/grpc_generator/.venv key: grpc_generator-only-main-${{ runner.os }}-py${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('tools/grpc_generator/poetry.lock') }} - name: Install grpc_generator run: poetry install -v --only main diff --git a/.github/workflows/check_docs.yml b/.github/workflows/check_docs.yml index 81cdea43..d397d1fa 100644 --- a/.github/workflows/check_docs.yml +++ b/.github/workflows/check_docs.yml @@ -4,7 +4,12 @@ on: workflow_call: inputs: package-name: - description: 'The name of the package to check.' + description: 'The name of the package folder to check.' + default: '' + required: true + type: string + package-basepath: + description: 'The base path of the package to check, relative to the repo root.' default: '' required: true type: string @@ -16,7 +21,7 @@ jobs: defaults: run: # Set the working-directory for all steps in this job. - working-directory: ./packages/${{ inputs.package-name }} + working-directory: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }} steps: - name: Check out repo uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -30,8 +35,8 @@ jobs: - name: Cache virtualenv (with docs) uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - path: .venv - key: ${{ inputs.package-name }}-with-docs-${{ runner.os }}-py${{ steps.setup-python.outputs.python-version }}-${{ hashFiles(format('packages/{0}/poetry.lock', inputs.package-name)) }} + path: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }}/.venv + key: ${{ inputs.package-name }}-with-docs-${{ runner.os }}-py${{ steps.setup-python.outputs.python-version }}-${{ hashFiles(format('{0}/{1}/poetry.lock', inputs.package-basepath, inputs.package-name)) }} - name: Install nitypes (with docs) run: poetry install -v --only main,docs - name: Generate docs @@ -40,4 +45,4 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ inputs.package-name }}-docs - path: packages/${{ inputs.package-name }}/docs/_build/ \ No newline at end of file + path: ${{ github.workspace }}/${{ inputs.package-basepath }}/${{ inputs.package-name }}/docs/_build/ diff --git a/.github/workflows/check_package.yml b/.github/workflows/check_package.yml index 8ddbdfec..a844720f 100644 --- a/.github/workflows/check_package.yml +++ b/.github/workflows/check_package.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: package-name: - description: 'The name of the package to check.' + description: 'The name of the package folder to check.' default: '' required: true type: string @@ -16,7 +16,7 @@ jobs: with: package-name: ${{ inputs.package-name }} check_codegen: - if: ${{ needs.get_package_info.outputs.proto-subpath != '' }} + if: ${{ needs.get_package_info.outputs.should-check-codegen == 'true' }} name: Check codegen for ${{ inputs.package-name }} needs: get_package_info uses: ./.github/workflows/check_codegen.yml @@ -25,7 +25,7 @@ jobs: proto-basepath: ${{ needs.get_package_info.outputs.proto-basepath }} proto-subpath: ${{ needs.get_package_info.outputs.proto-subpath }} proto-include-path: ${{ needs.get_package_info.outputs.proto-include-path }} - output-basepath: ./packages/${{ inputs.package-name }}/src + output-basepath: ${{ needs.get_package_info.outputs.package-basepath }}/${{ inputs.package-name }}/src output-format: ${{ needs.get_package_info.outputs.output-format }} check_analyzers: name: Check analyzers for ${{ inputs.package-name }} @@ -33,9 +33,13 @@ jobs: uses: ./.github/workflows/check_analyzers.yml with: package-name: ${{ inputs.package-name }} - install-drivers: ${{ needs.get_package_info.outputs.install-drivers == 'true' }} + package-basepath: ${{ needs.get_package_info.outputs.package-basepath }} + install-extras: ${{ needs.get_package_info.outputs.install-extras }} check_docs: + if: ${{ needs.get_package_info.outputs.should-check-docs == 'true' }} name: Check docs for ${{ inputs.package-name }} + needs: get_package_info uses: ./.github/workflows/check_docs.yml with: - package-name: ${{ inputs.package-name }} \ No newline at end of file + package-name: ${{ inputs.package-name }} + package-basepath: ${{ needs.get_package_info.outputs.package-basepath }} diff --git a/.github/workflows/get_package_info.yml b/.github/workflows/get_package_info.yml index 772c0794..fedb5d75 100644 --- a/.github/workflows/get_package_info.yml +++ b/.github/workflows/get_package_info.yml @@ -4,37 +4,53 @@ on: workflow_call: inputs: package-name: - description: 'The name of the package to check.' + description: 'The name of the package from packages.json.' default: '' required: true type: string outputs: + package-basepath: + description: 'The path to the parent directory of the package, relative to the repo root.' + value: ${{ jobs.get_package_info.outputs.package-basepath }} proto-basepath: - description: 'Base path for proto files.' + description: 'The base path to the proto files used for generation.' value: ${{ jobs.get_package_info.outputs.proto-basepath }} proto-subpath: - description: 'Subpath for proto files.' + description: 'The specific subpath to the proto files needed for generation, relative to the proto-basepath.' value: ${{ jobs.get_package_info.outputs.proto-subpath }} proto-include-path: - description: 'Include path for proto files.' + description: 'Additional path to include during proto generation.' value: ${{ jobs.get_package_info.outputs.proto-include-path }} output-format: - description: 'Output format.' + description: 'The format for the generated stubs. Options are submodule and subpackage.' value: ${{ jobs.get_package_info.outputs.output-format }} - install-drivers: - description: 'Whether to install drivers extra' - value: ${{ jobs.get_package_info.outputs.install-drivers }} + install-extras: + description: 'A space-separated list of package extras to install.' + value: ${{ jobs.get_package_info.outputs.install-extras }} + should-check-codegen: + description: 'Whether to check protobuf code generation.' + value: ${{ jobs.get_package_info.outputs.should-check-codegen }} + should-check-docs: + description: 'Whether to check documentation generation.' + value: ${{ jobs.get_package_info.outputs.should-check-docs }} + should-run-tests: + description: 'Whether to run automated tests.' + value: ${{ jobs.get_package_info.outputs.should-run-tests }} jobs: get_package_info: name: Get package info for ${{ inputs.package-name }} runs-on: ubuntu-latest outputs: + package-basepath: ${{ steps.parse_json.outputs.package-basepath }} proto-basepath: ${{ steps.parse_json.outputs.proto-basepath }} proto-subpath: ${{ steps.parse_json.outputs.proto-subpath }} proto-include-path: ${{ steps.parse_json.outputs.proto-include-path }} output-format: ${{ steps.parse_json.outputs.output-format }} - install-drivers: ${{ steps.parse_json.outputs.install-drivers }} + install-extras: ${{ steps.parse_json.outputs.install-extras }} + should-check-codegen: ${{ steps.parse_json.outputs.should-check-codegen }} + should-check-docs: ${{ steps.parse_json.outputs.should-check-docs }} + should-run-tests: ${{ steps.parse_json.outputs.should-run-tests }} steps: - name: Check out repo uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -47,9 +63,42 @@ jobs: echo "Error: Package '${{ inputs.package-name }}' not found in packages.json." >&2 exit 1 fi - echo "Package info: $info" - echo "proto-basepath=$(echo $info | jq -r '."proto-basepath"')" >> $GITHUB_OUTPUT - echo "proto-subpath=$(echo $info | jq -r '."proto-subpath"')" >> $GITHUB_OUTPUT - echo "proto-include-path=$(echo $info | jq -r '."proto-include-path"')" >> $GITHUB_OUTPUT - echo "output-format=$(echo $info | jq -r '."output-format"')" >> $GITHUB_OUTPUT - echo "install-drivers=$(echo $info | jq -r '."install-drivers"')" >> $GITHUB_OUTPUT \ No newline at end of file + + package_basepath=$(echo $info | jq -r '."package-basepath"') + proto_basepath=$(echo $info | jq -r '."proto-basepath"') + proto_subpath=$(echo $info | jq -r '."proto-subpath"') + proto_include_path=$(echo $info | jq -r '."proto-include-path"') + output_format=$(echo $info | jq -r '."output-format"') + install_extras=$(echo $info | jq -r '."install-extras"') + + should_check_codegen=false + if [ "${proto_subpath}" != "null" ]; then + should_check_codegen=true + fi + + should_check_docs=false + if [ -d "${GITHUB_WORKSPACE}/${package_basepath}/${{ inputs.package-name }}/docs" ]; then + should_check_docs=true + fi + + should_run_tests=false + if [ -d "${GITHUB_WORKSPACE}/${package_basepath}/${{ inputs.package-name }}/tests" ]; then + should_run_tests=true + fi + + if [ "${install_extras}" == "null" ]; then + install_extras="" + fi + + echo "package-basepath=${package_basepath}" >> $GITHUB_OUTPUT + echo "proto-basepath="${proto_basepath} >> $GITHUB_OUTPUT + echo "proto-subpath=${proto_subpath}" >> $GITHUB_OUTPUT + echo "proto-include-path=${proto_include_path}" >> $GITHUB_OUTPUT + echo "output-format=${output_format}" >> $GITHUB_OUTPUT + echo "install-extras=${install_extras}" >> $GITHUB_OUTPUT + echo "should-check-codegen=${should_check_codegen}" >> $GITHUB_OUTPUT + echo "should-check-docs=${should_check_docs}" >> $GITHUB_OUTPUT + echo "should-run-tests=${should_run_tests}" >> $GITHUB_OUTPUT + - name: Show package info + run: | + echo "${{ toJSON(steps.parse_json.outputs) }}" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 35413a2d..d33124cd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -102,7 +102,7 @@ jobs: expected-version: ${{ needs.get_package_info.outputs.package-version }} - name: Build distribution packages run: poetry build - working-directory: ./packages/${{ needs.get_package_info.outputs.package-name }} + working-directory: ${{ github.workspace }}/packages/${{ needs.get_package_info.outputs.package-name }} - name: Upload build artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: @@ -126,7 +126,7 @@ jobs: name: ${{ needs.get_package_info.outputs.package-name }}-distribution-packages path: ./packages/${{ needs.get_package_info.outputs.package-name }}/dist/ - run: ls -lR - working-directory: ./packages/${{ needs.get_package_info.outputs.package-name }} + working-directory: ${{ github.workspace }}/packages/${{ needs.get_package_info.outputs.package-name }} - name: Upload to ${{ env.environment }} uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 with: diff --git a/packages.json b/packages.json index ce871430..34543d2d 100644 --- a/packages.json +++ b/packages.json @@ -1,91 +1,138 @@ { + "grpc_generator": { + "package-basepath": "tools", + "proto-basepath": null, + "proto-subpath": null, + "proto-include-path": null, + "output-format": null, + "install-extras": null + }, "ni.datamonikers.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/datamonikers/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni-grpc-extensions" : { - "proto-subpath": "", - "output-format": "" + "package-basepath": "packages", + "proto-basepath": null, + "proto-subpath": null, + "proto-include-path": null, + "output-format": null, + "install-extras": null }, "ni.grpcdevice.v1.proto": { - "proto-basepath": "./proto", + "package-basepath": "packages", + "proto-basepath": "proto", "proto-subpath": ".", - "proto-include-path": "./proto", - "output-format": "subpackage" + "proto-include-path": "proto", + "output-format": "subpackage", + "install-extras": null }, "ni.measurementlink.discovery.v1.client": { - "proto-subpath": "", - "output-format": "" + "package-basepath": "packages", + "proto-basepath": null, + "proto-subpath": null, + "proto-include-path": null, + "output-format": null, + "install-extras": null }, "ni.measurementlink.discovery.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurementlink/discovery/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.measurementlink.measurement.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurementlink/measurement/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.measurementlink.measurement.v2.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurementlink/measurement/v2", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.measurementlink.pinmap.v1.client": { - "proto-subpath": "", - "output-format": "" + "package-basepath": "packages", + "proto-basepath": null, + "proto-subpath": null, + "proto-include-path": null, + "output-format": null, + "install-extras": null }, "ni.measurementlink.pinmap.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurementlink/pinmap/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.measurementlink.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurementlink", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.measurementlink.sessionmanagement.v1.client": { - "proto-subpath": "", - "output-format": "", - "install-drivers": true + "package-basepath": "packages", + "proto-basepath": null, + "proto-subpath": null, + "proto-include-path": null, + "output-format": null, + "install-extras": "drivers" }, "ni.measurementlink.sessionmanagement.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurementlink/sessionmanagement/v1", - "proto-include-path": "./third_party/ni-apis/ni/grpcdevice/v1", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis/ni/grpcdevice/v1", + "output-format": "subpackage", + "install-extras": null }, "ni.measurements.data.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurements/data/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.measurements.metadata.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/measurements/metadata/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "subpackage" + "proto-include-path": "third_party/ni-apis", + "output-format": "subpackage", + "install-extras": null }, "ni.panels.v1.proto": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/panels/v1", - "proto-include-path": "./third_party/ni-apis", - "output-format": "submodule" + "proto-include-path": "third_party/ni-apis", + "output-format": "submodule", + "install-extras": null }, "ni.protobuf.types": { - "proto-basepath": "./third_party/ni-apis", + "package-basepath": "packages", + "proto-basepath": "third_party/ni-apis", "proto-subpath": "ni/protobuf/types", - "proto-include-path": "./third_party/ni-apis", - "output-format": "submodule" + "proto-include-path": "third_party/ni-apis", + "output-format": "submodule", + "install-extras": null } -} \ No newline at end of file +}