簡體   English   中英

Nuget 私有源 - 可以在 PackageReference 中設置條件嗎?

[英]Nuget private source - possible to set condition in PackageReference?

我正在通過 github 設置一個私有 nuget 源。 一切運行良好,使用nuget.config像這樣(憑證部分已編輯):

<configuration>
  <packageSources>
    <add key="github" value="https://nuget.pkg.github.com/<my-company>/index.json" />
  </packageSources>
  <packageSourceCredentials>...</packageSourceCredentials>
</configuration>

注意,我沒有清除其他 packageSources:我仍然需要使用公共 nuget 源。 我只是添加了一個額外的私人資源。

正如我所說,一切正常,我可以從任一來源添加軟件包。 但是當我檢查csproj中的PackageReference條目時,我開始擔心。 它沒有指明 package 使用哪個來源。

例如,在本例中, MyCompany.Common來自我的私人來源, Newtonsoft.Json來自公共 nuget 來源。

  <ItemGroup>
    <PackageReference Include="MyCompany.Common" Version="1.0.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>

但是如果有一個同名的公共 package 呢? 我試過這個,而且它很有效。 所以換句話說,如果有人猜到我的私人 package 名稱,那么下次有人克隆 repo 並構建時,Visual Studio 很可能會從錯誤的來源獲取 package。

有沒有辦法防止這種情況? 我一直在閱讀Nuget PackageReference 文檔,唯一看起來很接近的可能是Condition

<PackageReference Include="Newtonsoft.Json" Version="9.0.1" Condition="'$(TargetFramework)' == 'net452'" />

但看起來這更多是根據解決方案/項目/系統配置設置條件,而不是 package 源。

是否有條件可以指定 package 源? 或者是否有其他東西可以為特定的 package 指定 nuget 源?

我想這可能與這篇文章有關。

這里有一個有趣的帖子

https://azure.microsoft.com/en-us/resources/3-ways-to-mitigate-risk-using-private-package-feeds/

我發現最實用的方法是 go 與鎖定模式,你將有一個 package.lock.json 文件這樣

"dependencies": {
    ".NETCoreApp,Version=v5.0": {
      "Newtonsoft.Json": {
        "type": "Direct",
        "requested": "[12.0.1, )",
        "resolved": "12.0.1",
        "contentHash": "pBR3wCgYWZGiaZDYP+HHYnalVnPJlpP1q55qvVb+adrDHmFMDc1NAKio61xTwftK3Pw5h7TZJPJEEVMd6ty8rg=="
      }
    }
  }

contentHash應該保護 package。

鎖定模式可以通過

<PropertyGroup>
    <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>

在閱讀@lastr2d2 在他的回答中提供的鏈接時,我發現了一段也很中肯的段落:

對於 NuGet 圖庫:發布者可以注冊ID prefix以限制上傳到公共圖庫。 注冊前綴下的包只能由批准的帳戶上傳,這也可以防止公共替換攻擊。 無論您是否打算將軟件包發布到 NuGet.org,都可以進行此預訂。 為私有包使用已注冊的 ID 前綴有助於確保攻擊者無法獲取您的任何姓名。”

(重點補充)

我爭論過是否在他的回答下添加這個作為評論,但最終決定這本身就是一個完整的解決方案,因此應該是一個單獨的答案。

不,NuGet 中沒有內置功能來執行這種“源過濾”,因為它在 scope 之外。

然而,有許多第三方(付費)NuGet 服務器產品公開了此類功能。 或者,您可以編寫自己的 NuGet 服務器來為您執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM