我期待着设置一个环境/配置,允许我为多个平台/目标构建和部署自定义库,例如构建配置和/或.NET框架版本。为此,我已经列出了以下结构:
MyProject.sln
src\
File1.cs
File2.Net30.cs
MyProject.Net40.csproj
MyProject.Net30.csproj
MyProject.Net45.csproj
所有项目文件都包含在解决方案中并立即构建。每个项目包含其目标框架的源文件和/或有条件地编译不同.NET版本的所有文件(使用编译器指令,例如NET35
,NET34_OR_GREATER
)。此外,每个项目文件包含以下msbuild指令:
<OutputPath>bin\$(Configuration)\$(Platform)\$(TargetFrameworkVersion)\$(TargetFrameworkIdentifier)\</OutputPath>
<BaseIntermediateOutputPath>obj\$(Configuration)\$(Platform)\$(TargetFrameworkVersion)\$(TargetFrameworkIdentifier)\</BaseIntermediateOutputPath>
<DocumentationFile>bin\$(Configuration)\$(Platform)\$(TargetFrameworkVersion)\$(TargetFrameworkIdentifier)\$(AssemblyName).xml</DocumentationFile>
这允许我通过将输出路由到不同的目录来一次构建它们。
现在,这一切都是为了建设。但是,我真的很难部署,特别是与NuGet有关。我创建了一个.nuspec,其中我手动包含了所有依赖项:
<file src="bin\Release\AnyCPU\v4.0\MyProject.dll" target="lib\net40-client\EIT.Foundation.dll" />
<file src="bin\Release\AnyCPU\v4.0\MyProject.xml" target="lib\net40-client\EIT.Foundation.xml" />
<file src="bin\Release\AnyCPU\v4.5\MyProject.dll" target="lib\net45\MyProject.dll" />
这很好用,但真的很乏味。所以第一个问题:有没有办法自动连接文件?
我的第二个问题:有时我的库本身就有NuGet依赖。对于项目依赖项,在下载NuGet依赖项时,会在与项目相同的文件夹中自动创建packages.config
。 packages.config
不仅包含项目中使用的依赖项或其版本,还需要依赖项的哪个框架版本。这是一个问题,因为每个项目文件(对于每个框架目标)都驻留在同一个文件夹中,因此他们需要以某种方式共享相同的packages.config
文件。我尝试将项目文件重定位到不同的结构:
MyProject.sln
target\
net40\MyProject.Net40.csproj
src\
File1.cs
...然而,我无法保留源文件夹中的文件夹结构(如果有的话),因为项目文件只允许我包含文件,而不是文件夹(它们是自动包含的。)有什么方法可以解决这个问题,还是NuGet根本不适合多目标构建?
答案 0 :(得分:4)
虽然NuGet支持为特定项目创建NuGet包,但它是针对单个项目的。命令是NuGet pack YourProject.csproj
,所以我怀疑它不会帮助你。使用.nuspec文件可能是实现此功能的唯一方法。
如果重命名packages.config文件,NuGet支持同一目录中的多个项目。每个packages.config文件都应该在项目后面命名。因此,在您的示例中,以下内容应该有效: