为多个平台目标构建、打包和部署
Build, pack up and deploy for multiple platform targets
我期待设置一个 environment/configuration 允许我为多个平台/目标构建和部署自定义库,例如构建配置 and/or .NET 框架版本。为此,我制定了以下结构:
MyProject.sln
src\
File1.cs
File2.Net30.cs
MyProject.Net40.csproj
MyProject.Net30.csproj
MyProject.Net45.csproj
所有项目文件都包含在解决方案中并立即构建。每个项目都包含其目标框架的源文件 and/or 所有文件,其中不同的 .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 根本不适合多目标构建?
虽然 NuGet 支持为特定项目创建 NuGet 包,但它针对的是单个项目。命令是 NuGet pack YourProject.csproj
所以我怀疑它不会帮助你。使用 .nuspec 文件可能是实现此功能的唯一方法。
如果重命名 packages.config 文件,NuGet 支持同一目录中的多个项目。每个 packages.config 文件都应以项目命名。因此,在您的示例中,以下内容应该有效:
- packages.MyProject.Net40.config
- packages.MyProject.Net30.config
- packages.MyProject.Net45.config
我期待设置一个 environment/configuration 允许我为多个平台/目标构建和部署自定义库,例如构建配置 and/or .NET 框架版本。为此,我制定了以下结构:
MyProject.sln
src\
File1.cs
File2.Net30.cs
MyProject.Net40.csproj
MyProject.Net30.csproj
MyProject.Net45.csproj
所有项目文件都包含在解决方案中并立即构建。每个项目都包含其目标框架的源文件 and/or 所有文件,其中不同的 .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 根本不适合多目标构建?
虽然 NuGet 支持为特定项目创建 NuGet 包,但它针对的是单个项目。命令是 NuGet pack YourProject.csproj
所以我怀疑它不会帮助你。使用 .nuspec 文件可能是实现此功能的唯一方法。
如果重命名 packages.config 文件,NuGet 支持同一目录中的多个项目。每个 packages.config 文件都应以项目命名。因此,在您的示例中,以下内容应该有效:
- packages.MyProject.Net40.config
- packages.MyProject.Net30.config
- packages.MyProject.Net45.config