[英]Nuget Conflicting projectreference and 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.