背景:我是一个相当新的包装和出版nuget的人。
我是一个包装和发布nuget的新手。长话短说,我有一个C#项目(我们称它为MYAPI项目),它依赖于一堆其他的nuget包。一些MYAPI的消费者,希望把它作为一个nuget包来引用,并自行处理他们产品的部署,而另一些消费者则希望MYAPI dlls被安装在特定的文件夹中,他们将在运行时从那里获取它。
所以我把MYAPI打包成nuget,并发布到内部的nuget服务器上。
问题:如何安装我的nuget?
我如何将我的nuget包安装到服务器上,使其拥有所有需要的依赖关系。我希望它看起来像 bin\debug
文件夹的样子,即根据目标框架,从所有依赖的nuget包中复制相关文件,包括主nuget包(本例中为MYAPI)。
我知道我可以通过将MYAPI打包成zip文件或msi来实现这个目的,除了nuget包之外。但是我不希望MYAPI有多种类型的包,我希望只用nuget包。我也了解到我可以在我的程序中引用所有的依赖关系。<files>
部分,但我认为这是一个可怜的方法。
有没有一种方法可以像Visual Studio那样做,即下载主nuget包及其所有的依赖项,解压它们,然后将所有解压的nuget包中的相关(基于框架版本的)文件复制到nuspec中。bin\debug
文件夹中。如果这不是开箱即用的,谁能告诉我VS用什么 "情报 "把文件复制到bin/debug文件夹里,这样我就可以在安装脚本中复制它。
EDIT:
这是一个普通的.NET框架项目,我说的是安装在生产服务器上,在那里,像MSBuild,VS这样的开发工具是不可用的。我仍然可以有nuget.exe命令,因为它是一个单一的可执行文件。
有没有一种方法可以像Visual Studio那样 "安装 "nuget包,但在部署服务器上。
我想你对这个问题有一些误解,你要的东西恐怕无法通过以下方式实现。鼻疽.
实际上,MSBuild的工作是将相关的nuget包的内容复制到bin/Debug中。
事实上, MSBuild(MSBuild.exe
)是一个带有vs开发环境的可执行文件。
Nuget 只是负责将软件包下载到你的本地,然后将其与你的项目关联。实际的内容复制操作纯粹是由 MSBuild.
在 VS IDE, MSBuild 是负责这个操作的。当你点击build时(实际上是调用 MSBuild.exe),nuget包的依赖DLL将被复制到你的输出文件夹。
为了证明这一点你可以新建一个空项目,然后安装这个nuget包,然后检查文件是否在bin\Debug下。之后,请执行 构建 来检查文件是否存在。
解决方案
自 VS2017, MSBuild 可单独安装,无需 VS IDE.
你可以安装 Visual Studio 2019的构建工具.
根据 所有下载--> Visual Studio 2019的工具--> Visual Studio 2019的构建工具
自 它可以从VS中单独安装,并且是轻量级的,现在很多开发者使用它在生产服务器上构建项目。
当你使用 nuget.exe
在你的项目中安装这样的nuget包,然后使用Build工具执行这样的命令。msbuild xxx\xxx\xxx.csproj -t:build
构建项目。之后,您将在 bin\Debug
文件夹。
更新1
其实nuget的工作是决定要复制哪些相应的依赖关系。但nuget将这些信息传递给 MSBuild. Nuget只需要确定相应的信息,就像制定计划一样,具体的行动由Nuget来执行。MSBuild包括引用、还原、复制等。所以你应该运行 MSBuild 才能得到自己想要的东西,到目前为止。
另外如果你还能得到你想要的东西,并跳过了 MSBuild 要直接获取文件,你可以 向团队提出功能建议(点击 建议功能).
你可以使用一个temporarypublish项目。用你想要的任何TFM创建项目,给包添加一个PackageReference,运行 dotnet publish
,然后删除 <project_name>.*
从发布目录。