dart-lang / pub

The pub command line tool
https://dart.dev/tools/pub/cmd
BSD 3-Clause "New" or "Revised" License
1.04k stars 229 forks source link

Provide a way to ignore the workspace when running pub commands #4357

Closed kevmoo closed 1 week ago

kevmoo commented 2 months ago

Scenario: you have a package that you want to use in docker.

You copy the package contents into docker and expect dart pub ... to work, but it fails because you haven't copied the entire repo.

I've had to create a hack script to delete the workspace property out of a pubspec to make things work. Not ideal.

sigurdm commented 2 months ago

I can see the need for this.

However if we do this as a flag to pub get (such as --ignore-workspace) we have a problem that this will not "stick" when eg. dart run is doing automatic validation of the resolution.

We could make a command like dart pub workspace drop that removes resolution workspace from the pubspec.yaml.

@jonasfj any ideas?

sigurdm commented 2 months ago

Talking with @jonasfj here are some options for consuming the package inside the docker image:

Also if we really wanted to provide something like this, it should probably be as an environment variable, as that could stick between commands.

sigurdm commented 2 months ago

@kevmoo do any of the above solutions work for you?

kevmoo commented 2 months ago

I'd LOVE to have an environment variable that's just PUB_IGNORE_WORKSPACE

jonasfj commented 2 months ago

Scenario: you have a package that you want to use in docker.

Copy the entire workspace into the container. Ideally, build an AOT snapshot and insert it into a docker image that only has the AOT-runtime (using docker multistage builds).

That said, I see how this is annoying, because docker build and similar tools can copy in files above Dockerfile.

How about using pubspec_override.yaml to specify resolution: null or resolution: root. It's a bit annoying to have to create such a file in a docker container after copying over the source files.


Do note that you actually run into one more problem. You are not copying over pubspec.lock, because it's sitting the workspace root. This means that: You'd be deploying untested code!.

Inside a Dockerfile one really should only ever use dart pub get --enforce-lockfile. So if you use workspaces, you'll need to copy over the entire workspace.

Or we'll need to:

sigurdm commented 1 month ago

With: https://github.com/dart-lang/pub/pull/4400 you can drop a file called pubspec_overrides.yaml reading: resolution: (ie. resolution: null) next to the pubspec.yaml and make pub ignore the workspace.

@kevmoo does that work for you?

kevmoo commented 1 week ago

@sigurdm – it'd be nice to just have a CLI option. But just adding a file and removing it is much more scriptable than trying to use sed in a Docker script 😄

sigurdm commented 1 week ago

@sigurdm – it'd be nice to just have a CLI option. But just adding a file and removing it is much more scriptable than trying to use sed in a Docker script 😄

Ok - I'll close this issue for now then.