gpt4 book ai didi

.net - 我想在 C# 构建期间运行脚本,但**仅当项目不是最新时**

转载 作者:行者123 更新时间:2023-12-04 03:56:47 25 4
gpt4 key购买 nike

我正在尝试设置一种正确的方法来为我在 .Net 中的 C# 项目进行自动版本控制。

要求是:

  1. 只有在不是最新的情况下才构建程序集。 (Visual Studio 中和通过 MSBuild 的正常行为)
  2. 构建程序集时,将分配正确的版本。

我找到了一个解决方案来提供我想要的版本字符串。但是,为了使程序集在构建后反射(reflect)此版本,我需要在构建之前更改 assemblyInfo.cs 文件。我最终通过添加要在预构建事件上运行的脚本来启用此功能。根据 Microsoft 文档,这应该没问题:

如果项目是最新的并且没有触发构建,则构建前事件不会运行。

(引用:http://msdn.microsoft.com/en-us/library/42x5kfw4.aspx):

这不是真的!预构建事件脚本总是执行 - 即使项目是最新的!那是。运行预构建脚本,即使它没有重新编译(因为它是最新的)。由于我的脚本更新了 assemblyInfo.cs 文件,该项目不再是最新的,因此它重新编译(由于错误/设计缺陷,我不得不添加指令以禁用缓存)。这意味着该项目每次 都重新编译,这当然不是我想要的 - 考虑到我的解决方案中有 103 个项目...

我通过在项目文件中添加 BeforeBuild 和 BeforeCompile 目标进一步调查了这一点。你猜怎么着:即使项目是最新的,它们也会每次 运行。我已尝试从 Visual Studio 和 MSBuild 运行构建,结果同样令人遗憾。

有没有人建议如何让脚本**仅*在项目不是最新的时候运行?

顺便说一句:在建议之前:我已经查看了网上提供的大多数解决方案,包括通过 assemblyInfo.cs 中的“1.*”说明符自动递增。 这不是我想要的。我的版本控制需求稍微复杂一些。

最佳答案

似乎没有人对此有解决方案,但经过额外调查,我终于找到了解决方法。

在调查 Microsoft.CSharp.targets 文件后,我发现 CoreCompile 中没有仅在运行 CoreCompile 时才调用目标的“ Hook ”。 CoreCompile 本身依赖于输入和输出的比较来确定它是否应该运行。有了这些信息,我从 CoreCompile 复制了输入和输出规范,瞧 :)

我的自定义 BeforeCompile 任务现在是这样的:

<Target
Name="BeforeCompile"
Inputs="$(MSBuildAllProjects);
@(Compile);
@(_CoreCompileResourceInputs);
$(ApplicationIcon);
$(AssemblyOriginatorKeyFile);
@(ReferencePath);
@(CompiledLicenseFile);
@(EmbeddedDocumentation);
$(Win32Resource);
$(Win32Manifest);
@(CustomAdditionalCompileInputs)"
Outputs="@(DocFileItem);
@(IntermediateAssembly);
@(_DebugSymbolsIntermediatePath);
$(NonExistentFile);
@(CustomAdditionalCompileOutputs)">
<Message Text="BeforeCompile (only when project is not up-to-date)"/>
</Target>

它看起来有点笨拙,但它确实有效。输入和输出可能也可以相当安全地复制。看不到 Microsoft 经常更改它们的任何充分理由......

关于.net - 我想在 C# 构建期间运行脚本,但**仅当项目不是最新时**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3608969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com