aws / aws-cdk

The AWS Cloud Development Kit is a framework for defining cloud infrastructure in code
https://aws.amazon.com/cdk
Apache License 2.0
11.5k stars 3.84k forks source link

[package.json+yarn] How to deal with the numerous "@aws-cdk/aws-*" `unmet peer dependency` warnings #9832

Open lestephane opened 4 years ago

lestephane commented 4 years ago

I come from the java world and try to reduce my dependencies to the exact set that I need. So I'm not an npm / yarn expert, but the verbosity I'm having to deal with in the context of installing aws-cdk modules is a bit intimidating.

When I do a fresh yarn install, I get lots of peer dependencies warnings. What am I supposed to do about it? If there is nothing I can do about it, how can I avoid seeing these warnings (and indeed why are they warnings at all)?

I think this is more of a generic npm / yarn question, but still, I want to know how people deal with this in the context of the aws-cdk, where each imported module has many peer dependencies, causing many such warnings. I don't like those, they keep reminding me that I'm either doing something wrong, or that yarn is using the wrong level of logging...

Input appreciated, thanks.

package.json fragment

  "dependencies": {
    "@aws-cdk/aws-dynamodb": "^1.59.0",
    "@aws-cdk/aws-ecs": "^1.59.0",
    "@aws-cdk/aws-lambda-event-sources": "^1.59.0",
    "@aws-cdk/aws-sns": "^1.59.0",
    "@aws-cdk/aws-sns-subscriptions": "^1.59.0",
    "@aws-cdk/aws-sqs": "^1.59.0",
    "@aws-cdk/core": "^1.59.0",
...
  }

yarn installoutput fragment

warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "@aws-cdk/aws-applicationautoscaling@1.59.0".
warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "@aws-cdk/aws-cloudwatch@1.59.0".
warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "@aws-cdk/aws-iam@1.59.0".
warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "@aws-cdk/aws-lambda@1.59.0".
warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "@aws-cdk/aws-kms@1.59.0".
warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "@aws-cdk/custom-resources@1.59.0".
warning " > @aws-cdk/aws-dynamodb@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-applicationautoscaling@1.59.0" has unmet peer dependency "@aws-cdk/aws-autoscaling-common@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-iam@1.59.0" has unmet peer dependency "@aws-cdk/region-info@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-codeguruprofiler@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-ec2@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-efs@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-events@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-logs@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3-assets@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda@1.59.0" has unmet peer dependency "@aws-cdk/cx-api@1.59.0".
warning " > @aws-cdk/core@1.59.0" has unmet peer dependency "@aws-cdk/cloud-assembly-schema@1.59.0".
warning " > @aws-cdk/core@1.59.0" has unmet peer dependency "@aws-cdk/cx-api@1.59.0".
warning " > @aws-cdk/core@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/custom-resources@1.59.0" has unmet peer dependency "@aws-cdk/aws-cloudformation@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/custom-resources@1.59.0" has unmet peer dependency "@aws-cdk/aws-logs@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ec2@1.59.0" has unmet peer dependency "@aws-cdk/assets@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ec2@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ec2@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3-assets@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ec2@1.59.0" has unmet peer dependency "@aws-cdk/cloud-assembly-schema@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ec2@1.59.0" has unmet peer dependency "@aws-cdk/region-info@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda > @aws-cdk/aws-efs@1.59.0" has unmet peer dependency "@aws-cdk/cloud-assembly-schema@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-s3@1.59.0" has unmet peer dependency "@aws-cdk/aws-kms@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/aws-lambda > @aws-cdk/aws-s3-assets@1.59.0" has unmet peer dependency "@aws-cdk/assets@1.59.0".
warning " > @aws-cdk/aws-sqs@1.59.0" has unmet peer dependency "@aws-cdk/aws-cloudwatch@1.59.0".
warning " > @aws-cdk/aws-sqs@1.59.0" has unmet peer dependency "@aws-cdk/aws-iam@1.59.0".
warning " > @aws-cdk/aws-sqs@1.59.0" has unmet peer dependency "@aws-cdk/aws-kms@1.59.0".
warning " > @aws-cdk/aws-sqs@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-ecs > @aws-cdk/cx-api@1.59.0" has unmet peer dependency "@aws-cdk/cloud-assembly-schema@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/custom-resources > @aws-cdk/aws-cloudformation@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning "@aws-cdk/aws-dynamodb > @aws-cdk/custom-resources > @aws-cdk/aws-cloudformation@1.59.0" has unmet peer dependency "@aws-cdk/cx-api@1.59.0".
warning " > @aws-cdk/aws-sns@1.59.0" has unmet peer dependency "@aws-cdk/aws-cloudwatch@1.59.0".
warning " > @aws-cdk/aws-sns@1.59.0" has unmet peer dependency "@aws-cdk/aws-events@1.59.0".
warning " > @aws-cdk/aws-sns@1.59.0" has unmet peer dependency "@aws-cdk/aws-iam@1.59.0".
warning " > @aws-cdk/aws-sns@1.59.0" has unmet peer dependency "@aws-cdk/aws-kms@1.59.0".
warning " > @aws-cdk/aws-sns@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ssm@1.59.0" has unmet peer dependency "@aws-cdk/cloud-assembly-schema@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-applicationautoscaling@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-autoscaling@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-autoscaling-hooktargets@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-certificatemanager@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-cloudwatch@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-ec2@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-ecr@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-ecr-assets@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-elasticloadbalancing@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-elasticloadbalancingv2@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-iam@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-kms@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-lambda@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-logs@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-route53@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-route53-targets@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-secretsmanager@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-servicediscovery@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/aws-ssm@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "@aws-cdk/cx-api@1.59.0".
warning " > @aws-cdk/aws-ecs@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-autoscaling@1.59.0" has unmet peer dependency "@aws-cdk/aws-autoscaling-common@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ecr@1.59.0" has unmet peer dependency "@aws-cdk/aws-events@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ecr@1.59.0" has unmet peer dependency "@aws-cdk/custom-resources@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ecr-assets@1.59.0" has unmet peer dependency "@aws-cdk/assets@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-ecr-assets@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-elasticloadbalancingv2@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-elasticloadbalancingv2@1.59.0" has unmet peer dependency "@aws-cdk/region-info@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53@1.59.0" has unmet peer dependency "@aws-cdk/cloud-assembly-schema@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53-targets@1.59.0" has unmet peer dependency "@aws-cdk/aws-apigateway@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53-targets@1.59.0" has unmet peer dependency "@aws-cdk/aws-cloudfront@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53-targets@1.59.0" has unmet peer dependency "@aws-cdk/aws-cognito@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53-targets@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53-targets@1.59.0" has unmet peer dependency "@aws-cdk/region-info@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-secretsmanager@1.59.0" has unmet peer dependency "@aws-cdk/aws-sam@1.59.0".
warning " > @aws-cdk/aws-sns-subscriptions@1.59.0" has unmet peer dependency "@aws-cdk/aws-iam@1.59.0".
warning " > @aws-cdk/aws-sns-subscriptions@1.59.0" has unmet peer dependency "@aws-cdk/aws-lambda@1.59.0".
warning " > @aws-cdk/aws-sns-subscriptions@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/assets@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/aws-certificatemanager@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/aws-ec2@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/aws-elasticloadbalancingv2@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/aws-logs@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3-assets@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-apigateway@1.59.0" has unmet peer dependency "@aws-cdk/cx-api@1.59.0".
warning "@aws-cdk/aws-ecs > @aws-cdk/aws-route53-targets > @aws-cdk/aws-cognito@1.59.0" has unmet peer dependency "@aws-cdk/custom-resources@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-apigateway@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-events@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-iam@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-kinesis@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-lambda@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "@aws-cdk/aws-s3-notifications@1.59.0".
warning " > @aws-cdk/aws-lambda-event-sources@1.59.0" has unmet peer dependency "constructs@^3.0.2".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-kinesis@1.59.0" has unmet peer dependency "@aws-cdk/aws-kms@1.59.0".
warning "@aws-cdk/aws-lambda-event-sources > @aws-cdk/aws-kinesis@1.59.0" has unmet peer dependency "@aws-cdk/aws-logs@1.59.0".
ilknarf commented 4 years ago

Seems like this is a yarn feature. https://github.com/yarnpkg/yarn/issues/5347 https://github.com/yarnpkg/yarn/issues/5347#issuecomment-463038189

Have you checked node_modules to see if the peer dependencies are in fact installed? I could reproduce this issue, but the dependencies showed up in node_modules as desired.

lestephane commented 4 years ago

Have you checked node_modules to see if the peer dependencies are in fact installed?

Yup, they are installed.

yarnpkg/yarn#5347 (comment)

If I depend on @aws-cdk/aws-ecs which in turns depends on 22(!) peer dependencies, and my code could break if I forget to add an explicit dependency on all of them, are these 22 peer dependencies not, in fact, actual transitive dependencies, and should not be declared as peer dependencies but 'real' dependencies in @aws-cdk/aws-ecs?

ilknarf commented 4 years ago

https://github.com/yarnpkg/yarn/issues/5347#issuecomment-386288470

Because they are dependencies of your dependencies, it throws a warning because it needs to be hoisted by the package manager. If you tried it with npm, it would do the same hoisting, but without printing the most of the warnings.

So no, you won't need to explicitly add the peer dependencies.

(Welcome to JS lol)

lestephane commented 4 years ago

Ok, but say, I import @aws-cdk/aws-dynamodb@1.59.0 but I don't make use of KMS encryption at all in conjunction with Dynamodb, and therefore has unmet peer dependency "@aws-cdk/aws-kms@1.59.0" is of no relevance to me, since all it's saying is "IF you use KMS in combination with DynamoDB, then it must be this aws-kms module version".

I don't care, since I'm not using KMS.

This, to me, points to the real problem, that peerDependencies have not been declared as optional (when applicable).

Looking at package.json for @aws-cdk/aws-dynamodb

  "dependencies": {
    ...
    "@aws-cdk/aws-kms": "1.60.0",
    ...
  },
  ....
  "peerDependencies": {
    ...
    "@aws-cdk/aws-kms": "1.60.0",
    ...
  },

Should there not be as well:

  "peerDependenciesMeta": {
    "@aws-cdk/aws-kms": {
      "optional": true
    }
  }

I think this would remove the warning and make the intent clear, as long as only optional peer dependencies are marked optional of course.

eladb commented 3 years ago

This will be solved in 2.0 of the AWS CDK. We are planning to release the entire CDK as a single module (aws-cdk-lib) so hopefully this hell will go away.

Here you can find more information about monolithic packaging.

We will consider annotating our deps with peerDependenciesMeta.optional for 1.x in the meantime to reduce the grief.

fractionalJoe commented 3 years ago

Any update on adding the optional annotation? I architect across many applications for a large enterprise and our migration to 2.0 will not be immediate. In the meantime, as an example, a very small project I'm involved with is getting 62 warnings of this type. When warnings become spam, developers ignore warnings. I believe we can all agree, that is not a desirable outcome.