ubuntu 20.04でnpmがaptで導入できない場合の対処方法

# はじめに
Ubuntu20.04にてReactの環境を再度構築しようとして、[Ubuntu20.04に最新のnode.jsとTypeScriptをインストールする方法](https://qiita.com/reoring/items/a91959eaccd74d058f1f)あたりを参考に`apt get`してみたが、以下のように`npm`導入でエラーになる事があってInstallできなかった。

ちょこっと調べて解決したので、備忘録として残しておく。


```bash:aptでnpmをInstall
sudo apt-get install npm
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 npm : 依存: node-gyp (>= 3.6.2~) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

# 解決方法
既に導入していた`libssl-dev`が依存している`libssl1.1`のバージョンが新しかったのが原因。

- 既に導入しているlibssl1.1 (= 1.1.1f-1ubuntu2.4)
- npm導入に必要なパッケージ：libssl-dev : 依存: libssl1.1 (= 1.1.1f-1ubuntu2.3)

このため、`libssl1.1` を自分の環境では、`1.1.1f-1ubuntu2.3`で指定してReInstallすれば`npm`の導入が可能だった。

```bash
$ sudo apt install --reinstall libssl1.1=1.1.1f-1ubuntu2.3
$ sudo apt install npm
```

あとは、お好みで、node.jsのバージョン固定用に、`npm`で`n`のpackageを導入。

```bash
$ sudo npm install n -g
```

最後に`n`でStableのnode.jsを導入すればOKです。

```bash
$ sudo n stable
```

ここまでこれば、最初に入れた古い`node.js`,`npm`は消しちゃってもOK。

```bash
$ sudo apt purge -y nodejs npm
$ exec $SHELL -l
```

# 試行錯誤した内容
何が悪いか、順に依存関係が満たせないパッケージをInstallしてみた。
### node-gypをインストール
```bash:node-gypのInstall
$ sudo apt install node-gyp
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 node-gyp : 依存: libnode-dev しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```
libnode-dev がInstallできないようなので、次に`libnode-dev`をInstallしてみる。

### libnode-devをインストール
```bash:libnode-devのInstall
$ sudo apt install lobnode-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ lobnode-dev が見つかりません
```

今度は、`lobnode-dev が見つかりません`とのことだったので、`lobnode-dev`をInstallしてみる。

### lobnode-devをインストール
```bash:lobnode-devのInstall
$ sudo apt install libnode-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 libnode-dev : 依存: libssl-dev (>= 1.1.1~) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

結局、既に導入していた`libssl-dev`が`(>= 1.1.1~)`となっているが満たせないのが分かった。

### libssl-devの確認。
まずは、問題を確認するため、`apt install`でレコメンド情報を見てみる

```bash:libssl-devのInstall
$ sudo apt install libssl-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 libssl-dev : 依存: libssl1.1 (= 1.1.1f-1ubuntu2.3) しかし、1.1.1f-1ubuntu2.4 はインストールされようとしています
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

`libssl1.1 (= 1.1.1f-1ubuntu2.3)`をInstallしたいが、`apt install`では、`1.1.1f-1ubuntu2.4`のバージョンでしかInstallされないようなので、強制的に`1.1.1f-1ubuntu2.3`をダウングレードReInstallしてみる。

### libssl-devのダウングレードインストール
前人の知恵として、[「Ubuntu 18.04でのlibssl-dev依存関係の問題」](https://www.it-mure.jp.net/ja/ubuntu/ubuntu-1804%E3%81%A7%E3%81%AElibssldev%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%81%AE%E5%95%8F%E9%A1%8C/944544979/)を参考にReInstallを試みる。

```bash:libssl1.1のダウングレードReInstall
$ sudo apt install --reinstall libssl1.1=1.1.1f-1ubuntu2.3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージは「ダウングレード」されます:
  libssl1.1
アップグレード: 0 個、新規インストール: 0 個、ダウングレード: 1 個、削除: 0 個、保留: 1 個。
1,320 kB のアーカイブを取得する必要があります。
この操作後に 1,024 B のディスク容量が解放されます。
続行しますか? [Y/n] y
取得:1 http://security.ubuntu.com/ubuntu focal-security/main amd64 libssl1.1 amd64 1.1.1f-1ubuntu2.3 [1,320 kB]
1,320 kB を 2秒 で取得しました (625 kB/s)                       
パッケージを事前設定しています ...
dpkg: 警告: libssl1.1:amd64 を 1.1.1f-1ubuntu2.4 から 1.1.1f-1ubuntu2.3 にダウン
グレードしています
(データベースを読み込んでいます ... 現在 241242 個のファイルとディレクトリがイン
ストールされています。)
.../libssl1.1_1.1.1f-1ubuntu2.3_amd64.deb を展開する準備をしています ...
libssl1.1:amd64 (1.1.1f-1ubuntu2.3) で (1.1.1f-1ubuntu2.4 に) 上書き展開していま
す ...
libssl1.1:amd64 (1.1.1f-1ubuntu2.3) を設定しています ...
libc-bin (2.31-0ubuntu9.3) のトリガを処理しています ...
sazus@charon:~$ sudo apt install libssl-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
提案パッケージ:
  libssl-doc
以下のパッケージが新たにインストールされます:
  libssl-dev
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 1 個。
1,582 kB のアーカイブを取得する必要があります。
この操作後に追加で 8,006 kB のディスク容量が消費されます。
取得:1 http://security.ubuntu.com/ubuntu focal-security/main amd64 libssl-dev amd64 1.1.1f-1ubuntu2.3 [1,582 kB]
1,582 kB を 2秒 で取得しました (733 kB/s)
以前に未選択のパッケージ libssl-dev:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 241242 個のファイルとディレクトリがイン
ストールされています。)
.../libssl-dev_1.1.1f-1ubuntu2.3_amd64.deb を展開する準備をしています ...
libssl-dev:amd64 (1.1.1f-1ubuntu2.3) を展開しています...
libssl-dev:amd64 (1.1.1f-1ubuntu2.3) を設定しています ...
```

これで`npm`導入に必要な`libssl1.1`が導入できたので、あとは`sudo apt install npm`するだけでOK