angular / angular-cli

CLI tool for Angular
https://cli.angular.dev
MIT License
26.78k stars 11.98k forks source link

assets entry for the build-angular does not support yarn pnp package paths? #25263

Open jamesrusso opened 1 year ago

jamesrusso commented 1 year ago

Command

build

Is this a regression?

The previous version in which this bug was not present was

No response

Description

It does not appear to be possible to include assets and paths from a yarn pnp package.

It seems that build-angular builder supports pnp package resolution for styles, but not assets.

I would expect the assets path (dictionary specification option) to work to copy paths from pacakges in the pnp environment.

Minimal Reproduction

% ng new test-yarn-example --style scss --no-routing % cd test-yarn-example % yarn add ng2-pdfjs-viewer

Next, add the path to the angular.json.

Just adding the string will result in the error saying it must be in the project source root.

Adding the dictionary version, yields no error but does not copy the assets either.

     {
                "glob": "**/*",
                "input": "node_modules/ng2-pdfjs-viewer/pdfjs",
                "output": "/assets/pdfjs"
     }

% yarn build

Exception or Error

Unable to copy assets: The ng2-pdfjs-viewer/node_modules/pdfjs asset path must start with the project source root.

Your Environment

Angular CLI: 16.0.2
Node: 18.15.0
Package Manager: yarn 3.5.0
OS: darwin arm64

Angular: 16.0.2
... animations, cli, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1600.2 (cli-only)
@angular-devkit/build-angular   16.0.2
@angular-devkit/core            16.0.2 (cli-only)
@angular-devkit/schematics      16.0.2 (cli-only)
@schematics/angular             16.0.2 (cli-only)
rxjs                            7.8.1
typescript                      5.0.4

Anything else relevant?

No response

judilsteve commented 9 months ago

+1 for this, it's the last blocker for us moving to Yarn PnP, which would be really valuable for us, mainly because installing packages is currently a large part of our CI (dockerised) build time, and Yarn PnP is significantly faster for installing packages from a lockfile without any packages in cache.

stefan-pavlovic-ded commented 7 hours ago

+1 for this from me, as well. Using pnpify utility circumvents the problem so we can still use PnP, but it would, of course, be better if we can do without it.

Looking through the code base, I think this file needs to be modified: https://github.com/angular/angular-cli/blob/main/packages/angular/build/src/utils/resolve-assets.ts

I think it can be fixed by adding an additional option like 'source: file | module' or something like that and using path.dirname(require.resolve("moduleName/package.json")); in case if it is a module (but I am not a node expert). Or, alternatively, it can first try to get the asset directly from the file and then try checking if it is in the module.