我期待设置一个环境/配置,使我可以为多个平台/目标(如构建配置和/或.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不适合多目标构建?
正是我正在寻找。我认为重命名packages.config将使NuGet无法找到依赖关系,但它似乎工作。 :) – artganify
它不是广为人知的NuGet功能。 [NuGet 2.8发行说明](https://docs.nuget.org/release-notes/nuget-2。)上有一段。8#user-content-individual-packagesconfig-files-for-different-platforms)但这是我除了阅读源代码以外唯一看到的文档:) –
Upvote for gods work and actually study nuget source to out out如何做东西。 (并非每个人都有时间)。 :) – artganify