質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

10097閲覧

オフラインでdotnet publish や NuGetを利用する方法

BeatStar

総合スコア4962

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2021/12/21 04:57

編集2021/12/22 10:33
[概要] とある理由で常にオフラインのPCでdotnet publishやNuGetを利用したい。 しかしNuGetはオンライン前提のようで今の状態では利用不可能となっている。 この問題を解決したい。 つまり、下記の処理を行いたい。 ■ .NET5での自己完結型の作成をオフラインで行う ■ CommonDialog等のようなNuGetを使うpackageの導入をオフラインで行う(DL時はオンラインでもOK)

趣味でC#( .NET5 )をやっています。
とある理由から自分のPCでは常にオフライン状態です。また、その理由が原因で、VC#も利用できないとします。

なので、

dotnet publish -c Release --self-contained true -r win-x64

としても、

C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み 込めません。 [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 (api.nuget.org:443) [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 [<対象プロジェクト>.csproj]

というエラーを吐きます。

C:\Program Files\dotnet\sdk\5.0.201\NuGet.targetsの131行目は、

<RestoreTask RestoreGraphItems="@(_RestoreGraphEntryFiltered)" RestoreDisableParallel="$(RestoreDisableParallel)" RestoreNoCache="$(RestoreNoCache)" RestoreIgnoreFailedSources="$(RestoreIgnoreFailedSources)" RestoreRecursive="$(RestoreRecursive)" RestoreForce="$(RestoreForce)" HideWarningsAndErrors="$(HideWarningsAndErrors)" Interactive="$(NuGetInteractive)" RestoreForceEvaluate="$(RestoreForceEvaluate)" RestorePackagesConfig="$(RestorePackagesConfig)"/> </Target>

となっています。

手順としては、

1. プロジェクトを生成する場所をカレントディレクトリとする 2. dotnet new console -n <プロジェクト名> のようにして生成する 3. そのまま dotnet publish -c Release --self-contained true -r win-x64 と叩く -> ここでエラーが発生

となっています。

調べたところによると、どうやらNuGetを使っており、オンラインでやる前提みたいです。
ですが、私の環境ではとある理由からオフラインでしか開発できません。

こういう場合、どのようにすればpublishやNuGetを使うもの(例: CommonDialog等)をオフラインで利用できるでしょうか?

「C# dotnet publish オフライン」で調べても『VisualStudio C#で組む前提』となっており、私の環境とは別物で参考になりません。

[試したこと1] 「C# dotnet publish オフライン」でggる ↓ [結果] VC#を前提とした使い方で、VC#の設定をいじる方法であったため参考にならず。
[試したこと2] 「C# nuget オフライン」でggる ↓ [結果] VC#を前提とした使い方で、VC#の設定をいじる方法であったため参考にならず。

もうちょっと調べてみると、「一度オンライン状態でpublishやNuGetするとC:\Users<ユーザ名>等にパッケージがインストールされる」らしいので、
試したこと3~5もやってみました。

注意: 自分のPCをMainPC, 一時的にオンラインにしてpublish版としてコンパイルするためのPC(借り物)をSubPCとする。

[準備]
SubPCでdotnet publishでやり、C:\Users<ユーザ名> にある .templateengine と .nuget ディレクトリ、
C:\Users<ユーザ名>\AppData\Local にある NuGetディレクトリをそれぞれ丸ごと USBメモリにコピー。

[試したこと3] 準備で用意したUSBメモリをMainPCに接続し、.nugetディレクトリを同じ場所(ユーザ名は異なる)に配置。 そして dotnet publsih ~ でやる。(もちろんオフライン) ↓ [結果] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み 込めません。 [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 (api.nuget.org:443) [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 [<対象プロジェクト>.csproj]
[試したこと4] 準備で用意したUSBメモリをMainPCに接続し、三つのディレクトリをそれぞれ同じ場所(ユーザ名は異なる)に配置。 そして dotnet publsih ~ でやる。(もちろんオフライン) (つまり .templateengine と .nuget 、NuGet のそれぞれのディレクトリを再現) ↓ [結果] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み 込めません。 [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 (api.nuget.org:443) [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 [<対象プロジェクト>.csproj]
[試したこと5] 試したこと4の状態で、C:\Users\<ユーザ>.templateengineにあるsettings.jsonに記述されているパスのユーザ名を書き換える (MainPCとSubPCではユーザ名が違うので) ↓ [結果] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み 込めません。 [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 (api.nuget.org:443) [<対象プロジェクト>.csproj] C:\Program Files\dotnet\sdk\5.0.201\NuGet.targets(131,5): error : そのようなホストは不明です。 [<対象プロジェクト>.csproj]

つまり、なんら変化がありませんでした。

今私が思いつくものすべて試してみましたが、変化がありません。

できればオフライン状態のMainPCでどうにか利用できたら楽なのですが…

ちなみに、publishでも--self-contained true -r win-x64を削除するとちゃんと動くが、dotnet build -c Releaseと構成が全く同じになる。

[情報]
言語: C#
.NET: .NET5( 5.0.201 )
VC#: 利用不可
エディタ: VSCode (← 関係ないけど書いておく)
PCの状態: 常にオフラインで、必要があれば借り物のPCからDL


[追記1]

radianさんが提示してくださったページを参考にやってみました。

ここからMicrosoft.NETCore.App.Runtime.win-x64等をDLし、
ソースコードがあるディレクトリに packages ディレクトリを生成してその中にmicrosoft.netcore.platforms.5.0.0.nupkg等のパッケージを配置。
(本質問のやつだと『バージョンが違う』系のエラーが出たので上記サイトからDL。エラーメッセージはコピーとるのを忘れてしまいましたが…)

そして、dotnet dotnet nuget locals all -clearと打ち、初期化。

dotnet add package microsoft.netcore.platforms -s .\local-packagesとやって、

プロジェクトファイル( *.csproj )の PropertyGroupに <RestoreSources>$(RestoreSources);./packages</RestoreSources>と追記し、
dotnet restoreとやってみました。

一応、microsoft.netcore.platforms は一応書き込まれるようですが、 Microsoft.NETCore.App.Runtime.win-x64とかで

dotnet restore 復元対象のプロジェクトを決定しています... <プロジェクトのパス>.csproj : error NU1213: パッケージ Microsoft.NETCore.App.Runtime.win-x64 5.0.0 には、このプロジェクトと互換性のないパッケージの種類 DotnetPlatform が含まれています。 <プロジェクトのパス>.csproj を復元できませんでした (449 ms)。

となってしまいます…

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

実際に試してませんが、.nupkgあるならこれで行けるんじゃないですかね。
Add a package with a local package file in 'dotnet'

投稿2021/12/21 05:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2021/12/22 10:36

ご回答ありがとうございます。 提示してくださったページを参考にやってみましたが、追記1の状態になってしまいます… 恐らくバージョンが問題なのでしょうけど、DL時のバージョンもちゃんと5.0.0なのに…
guest

0

ベストアンサー

オフラインでdotnet publish や NuGetを利用する方法

思いつく策は下記になりますね。

  1. NuGetのプライベート・リポジトリ機能 を使ってローカルで Web サーバーを立ててそこから dll をインストールする
  2. NuGet を使わずサブのパソコンからダウンロードした DLL を VisualStudio の参照設定に追加する形で開発する
  3. 環境を改善してオンラインで開発する

Visual Studio が使えないという制約がある場合は 2 の案と同等の策として
How do I include DLLs in my .csproj file? を試してください。

csproj ファイルに reference タグでローカルの DLL を指定して参照設定が行えます。また、実際のパスを指し示すために HintPath タグが必要になります。必要な DLL はサブのパソコンからダウンロードしてください。

投稿2021/12/21 05:53

編集2021/12/23 03:27
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2021/12/21 06:00 編集

ローカルのネットワーク上(複数のPC)で開発をするなら策1はおすすめです。 しかし、もし1台のパソコンだけで(かつオフラインで)開発するならそもそも NuGet をわざわざ利用しなくても良いような気がしています。(dotnet publish については NuGet の件を解決すれば芋づる式に解決できる認識です)
BeatStar

2021/12/22 10:48

ご回答ありがとうございます。 (3)は現在ではとある理由は改善できそうにないので無理っぽいです。(2)はVC#を使うのでちょっと厳しいと思います。 (1)はざっと目を通したときにVC#を使うのを前提としているようなのでまだ試していません… (よくよく読んだら『HTTPベースのプライベート・リポジトリ』のやつはもしかしたらできるかもしれない…)
BluOxy

2021/12/23 02:46

2 の案は実際に何が厳しくなるのでしょうか。NuGet を使わずとも必要な dll が揃ってさえいれば Visual Studio 上で、かつローカルの環境で C# アプリケーションを開発することができます。
BluOxy

2021/12/23 03:15

> VC#を使うのでちょっと厳しい 単純に Visual Studio が使えない環境という事ですね。上記の質問は忘れてください。
guest

0

私の環境ではちょっと現段階では厳しいようなのでやや搦め手なやり方として書いておきます。
(本来の方向性はBluOxyさんのご回答通りかと思いますが、ちゃんとやろうとするとどうしてもMainPCとSubPCの行き来しないといけないので時間がかかり、BAを選べないので…)

まず、単純にCommonDialog等のようなNuGetを利用して拡張する場合は、ここから必要なパッケージのバージョンを指定してDL。(またはNuGet CLIでDL)
それをプロジェクトのディレクトリ内に packages等のようなディレクトリを生成してその中に入れておく。
そして、dotnet add package <パッケージ名> -s .\packages のように -sオプションで パッケージがあるディレクトリのパスを指定してaddし、dotnet restoreする。
そのままdotnet build 等のコマンドを叩いてコンパイルしました。

publish版のものはフレームワーク依存の方とSelf-contained の方を比較すると、単純にDLLが追加されていて、同梱のjsonファイルに追記されているようなので、単純にフレームワーク依存タイプにSelf-contained用のDLL群をコピーしてみました。それで動いたのでこれで今のところやろうかと思っています。(実際にはSelf-containedの方のjsonファイルもコピーしましたが)

投稿2021/12/24 09:41

編集2021/12/25 07:40
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問