所以我在使用nuget软件包时遇到了一种非常奇怪的行为。
假设我有一个名为Framework
的软件包,并且该软件包是Package A
和Package B
的依赖项
现在我有一个Client 1
,它具有Framework
,Package A
,Package B
作为依赖项,它必须像这样,因为例如Client 2
可能不需要Package A
,但需要另外2个或仅需要框架的客户端。
现在这是事情变得奇怪的地方。如果出于测试目的,我为Framework
创建了Client 1
的本地版本以测试一些更改,但是Package A/B
仍然来自发布它们的注册表,它将抱怨旧版本找不到框架的版本(是Package A/B
的构建版本),所以我现在想知道是否有任何方法将nuget包及其所有依赖项作为独立包捆绑在一起? / p>
这是一个示例.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningsAsErrors />
</PropertyGroup>
<ItemGroup>
<Folder Include="Component\" />
<Folder Include="Model\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Package.A" Version="1.0.1-SNAPSHOT" />
<PackageReference Include="Framework" Version="[5.*,)" />
</ItemGroup>
</Project>
我的pack命令通常是:
dotnet pack -p:PackageVersion=1.1.2-SNAPSHOT -o C:\Users\SomeUser\Desktop\Projects\NuGetPackages
答案 0 :(得分:0)
是否有任何方法可以将带有所有依赖项的nuget包作为独立包捆绑在一起?
不是使用当前工具,而是highest upvoted issue on GitHub。
如果确实要使用它,则可以使用PackagePath将dll包含在包中(例如<None Include="path\to\framework.dll" PackagePath="lib/<tfm>/" />
)。或者,创建一个nuspec
file and specify all the assemblies to include。
但是,这有几个问题。一种是与framework.dll
捆绑在一起的Package.A
的版本不同于与Package.B
捆绑在一起的版本时,该应用最终将使用哪个版本?文件名必须是唯一的,因此两者不能同时存在。通过将框架作为一个独立的软件包(这是其他两个软件包的依赖项),可以很清楚地看到只选择了一个,并且清楚了选择了哪个版本。另一个问题是,如果Framework中存在错误,如果它是依赖关系,则应用程序可以使用修复该错误的版本将框架直接引用为直接依赖关系。如果Framework.dll捆绑在其他软件包中,则不仅需要修复Framework,而且还需要发布其他软件包的新版本,其中包括此新版本。捆绑销售时,您将使维修错误的修复变得更加困难。
但是,我不认为这能解决您的问题。您的描述“它会抱怨找不到较旧版本的框架”缺少详细信息以了解确切的错误,但是我假设您的框架dll是强名称签名的,并且在运行时失败,并出现文件未找到错误关于软件包编译所依据的版本。在这种情况下,您可能要使用binding redirects,尽管对于SDK样式的项目,我认为当检测到多个程序集引用同一程序集名称的不同版本时,应该自动完成此操作。
如果此答案无济于事,我想我们需要更多有关您遇到的实际错误以及您“为客户端1创建本地版本的Framework以测试一些更改”的精确程度的信息(您是否已将ProjectReference
添加到framework.csproj,或者您是否编译了framework.dll并在测试项目中添加了对该dll的引用,等等?