我试图找到最好的方式来加载加载项和任务,以防发生更改。
背景
我已经基于Cake 0.25.0创建了一个插件和一些任务。插件和任务都打包在NuGet包中。现在,我想将使用的Cake版本更新为0.32.1,但这并不容易,我尝试在下面进行解释。
我创建的这些NuGet程序包在多个存储库中使用,我会不时提供修补程序。为了能够自动加载插件/任务的最新版本,预处理器指令中未定义任何版本。这样的意思:
#load nuget:My.Tasks
#addin nuget:My.AddIn
我的困境
我需要确保较早的发行版仍然可以使用如上所述的预处理器指令。现在,我正在寻找实现此目标的方法。 我认为重命名原始程序包ID会有所帮助,每个想使用我的程序包升级版的人都必须在他们的build.cake中更改preprocessor指令。
但是我很确定必须有一个更明智的方法,希望您能为我提供帮助。
我的下一个想法是使用#define预处理程序指令。因此,我创建了一个新的NuGet程序包,其中仅包含一个名为bootstrapper.cake的Cake脚本,如下所示:
#if (V20)
#load nuget:My.Tasks
#addin nuget:My.AddIn
#else
#load nuget:My.Tasks&version=1.0.55
#addin nuget:My.AddIn&version=1.0.55
#end
这无法正常工作。不幸的是,各个软件包的两个版本都分别加载到addins工具目录中,并且出现诸如“错误CS0111:类型'Submission#0'已经定义了一个名为成员”之类的错误。
有没有办法实现我的目标?在我看来,使用#define的想法非常好。也许有某种可能性,或者有人知道更好的方法吗?
我个人认为最好的是,如果Cakebuild在预处理器指令中支持通配符,例如
#load nuget:My.Tasks&version=1.0.*
最好的问候
先生。 T
答案 0 :(得分:3)
Ifdef当前无法与预处理器指令一起使用,因为它们已在执行预处理器指令后由C#编译器处理。
您可以做的是使用环境变量,预处理器指令支持环境变量替换。
例如:
设置变量
RECIPE_VERSION="&version=0.3.0-unstable0400"
可以这样使用
#load nuget:?package=Cake.Receipe%RECIPE_VERSION%
没有设置环境变量,它将忽略版本。