针对多个平台目标进行构建、打包和部署

本文关键字:构建 部署 平台 目标 | 更新日期: 2023-09-27 18:00:42

我期待着设置一个环境/配置,使我能够为多个平台/目标构建和部署自定义库,例如构建配置和/或.NET框架版本。为此,我制定了以下结构:

MyProject.sln
src'
   File1.cs
   File2.Net30.cs
   MyProject.Net40.csproj
   MyProject.Net30.csproj
   MyProject.Net45.csproj

所有项目文件都包含在解决方案中,并一次生成。每个项目都包含其目标框架的源文件和/或有条件地编译不同.NET版本的所有文件(使用编译器指令,例如NET35NET34_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.configpackages.config不仅包含项目中使用的依赖项或其版本,还包含需要依赖项的哪个框架版本。这是一个小问题,因为每个项目文件(针对每个框架目标)都位于同一个文件夹中,因此它们需要以某种方式共享相同的packages.config文件。我试着将项目文件重新定位到一个不同的结构,比如:

MyProject.sln
target'
   net40'MyProject.Net40.csproj
src'
   File1.cs

然而,我无法在我的源文件夹中保留文件夹结构(如果有的话),因为项目文件只允许我包括文件,而不允许我包括文件夹(它们是自动包括的。)有什么办法解决这个问题吗?或者NuGet根本不适合多目标构建吗

针对多个平台目标进行构建、打包和部署

虽然NuGet支持为特定项目创建NuGet包,但它是针对单个项目的。命令是NuGet pack YourProject.csproj,所以我怀疑它对你没有帮助。使用.nuspec文件可能是实现此功能的唯一方法。

如果重命名packages.config文件,NuGet支持同一目录中的多个项目。每个packages.config文件都应该以项目的名称命名。因此,在您的示例中,以下内容应该有效:

  • packages.MyProject.Net40.config
  • packages.MyProject.Net30.config
  • packages.MyProject.Net45.config