package-lock.jsonがある状態でyarn installするとServerlessのデプロイで痛い目にあう

はい、あいました。

Nuxt.js+TypeScriptなアプリと、GoLangのワーカーを混在させたプロジェクトをServerlessでデプロイするとなぜか```node_modules``` の中身が全部パッケージに含まれてしまい、ファイルサイズオーバーAWS Lambdaにデプロイできなくなりハマっていました。
```serverless.yml``` の```package.excludeDevDependencies``` で含める含めないの指定ができるのですが、どう指定してもだめ。。。

Serverless Framework Guide - AWS Lambda Guide - Packaging
https://serverless.com/framework/docs/providers/aws/guide/packaging/#development-dependencies


いろいろと原因が考えられてあれこれと調査した結果、原因は(案の定)大したことがありませんでした。

## 原因

```package-lock.json``` がプロジェクトにある状態で、```yarn install``` すると、Serverlessのパッケージ作成で```node_modules``` の中身を全部パッケージに含んでしまう。

理由はわかっていません。

## 再現

適当なディレクトリにServerlessでnode.jsのプロジェクトを作成します。

```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> npm init

# serverlessがあグローバルにインストールされてなかったら
#> npm install -g serverless

> npm install -D serverless
> serverless --version
1.33.2

> serverless create --template aws-nodejs --name node-app

> cat package.json
{
  "name": "node-app",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "serverless": "^1.33.2"
  }
}
```

プロジェクトが作成できたら```serverless package``` でzipファイルを作成します。

```sh
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...

> ll .serverless/
-rw-r--r--  1 user  Users   361B 11 28 13:50 cloudformation-template-create-stack.json
-rw-r--r--  1 user  Users   3.6K 11 28 13:50 cloudformation-template-update-stack.json
-rw-r--r--  1 user  Users    69K 11 28 13:50 node-app.zip
-rw-r--r--  1 user  Users   5.8K 11 28 13:50 serverless-state.json

> cd .serverless/
> unzip node-app.zip
Archive:  node-app.zip
  inflating: handler.js
  inflating: package-lock.json
  inflating: package.json
```

はい。
Serverless以外モジュールを含めておらず、かつ```devDependencies``` なので、パッケージに含められるモジュールはありません。zipファイルのサイズは69KBと軽量です。


で、ある日突然気が変わって```npm``` から```yarn``` に鞍替えしたとします。
```yarn install``` でモジュールをインストールしなおします。

```sh:Yarnが使いたい気分になった感じ
# Yarnがインストールされてなかったら
# > npm install -g yarn

> cd ..
> rm -rf node_modules/

> yarn install

yarn install v1.12.3
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
(略)
success Saved lockfile.
```

改めてパッケージを作成します。

```sh
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...
```

！！！
zipのファイルサイズがすっごく増えました！！！
解凍してみると、さっきはなかった```node_modules``` が含められています。

```sh
> ll .serverless/
total 34856
-rw-r--r--  1 user  Users   361B 11 28 13:58 cloudformation-template-create-stack.json
-rw-r--r--  1 user  Users   3.6K 11 28 14:00 cloudformation-template-update-stack.json
-rw-r--r--  1 user  Users    17M 11 28 14:00 node-app.zip
-rw-r--r--  1 user  Users   5.8K 11 28 14:00 serverless-state.json

> cd .serverless/
> unzip node-app.zip
Archive:  node-app.zip
  inflating: handler.js
　　　　(お察し)
  inflating: node_modules/zip-stream/index.js
  inflating: node_modules/zip-stream/package.json
  inflating: package-lock.json
  inflating: package.json
  inflating: yarn.lock
```

## 解決策

```npm``` に戻るか、```package-lock.json``` を削除すると解消できます。

```sh
> cd ..
> rm package-lock.json
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...

> ll .serverless/
total 152
-rw-r--r--  1 user  Users   361B 11 28 14:03 cloudformation-template-create-stack.json
-rw-r--r--  1 user  Users   3.6K 11 28 14:04 cloudformation-template-update-stack.json
-rw-r--r--  1 user  Users    57K 11 28 14:04 node-app.zip
-rw-r--r--  1 user  Users   5.8K 11 28 14:04 serverless-state.json
```

## ```yarn.lock``` がある状態で、```npm install``` したらどうなるか

逆だと大丈夫でした。なんぞ？

```sh
> rm -rf node_modules
> npm install
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...

> ll .serverless/
-rw-r--r--  1 user  Users   361B 11 28 14:14 cloudformation-template-create-stack.json
-rw-r--r--  1 user  Users   3.6K 11 28 14:14 cloudformation-template-update-stack.json
-rw-r--r--  1 user  Users    69K 11 28 14:14 node-app.zip
-rw-r--r--  1 user  Users   5.8K 11 28 14:14 serverless-state.json
```


## まとめ


```yarn install``` 時にワーニングしてくれています。パッケージマネージャは混在させないでおきましょう。

>package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.

(Google翻訳)
> package-lock.jsonが見つかりました。 あなたのプロジェクトには、糸以外のツールで生成されたロックファイルが含まれています。 非同期ロックファイルによって引き起こされる解決の不一致を避けるために、パッケージマネージャを混在させないことが推奨されます。 この警告をクリアするには、package-lock.jsonを削除してください。


## 参考

Serverless Framework Guide - AWS Lambda Guide - Packaging
https://serverless.com/framework/docs/providers/aws/guide/packaging/#development-dependencies