gpt4 book ai didi

visual-studio-2010 - MSBuild 目标,BeforeCompile,在加载项目文件时触发

转载 作者:行者123 更新时间:2023-12-03 10:31:43 24 4
gpt4 key购买 nike

这是一个与我的整体问题相关的较小问题。这就是我正在努力实现的目标。

我创建了一个修改我的源文件的任务。每当我编译和构建时,我都想使用修改后的 cs 文件进行编译。我试图制作一个从预构建事件调用的控制台应用程序,但我发现只编译了一些修改过的文件。即使我没有在编辑器中打开它们。然后我尝试使用一个自定义任务,该任务与我的 csproj 文件中的以下 xml 一起使用:

<Target Name="BeforeCompile">
<MyCustomTask />
</Target>

我也用它来获得相同的结果:
<PropertyGroup>
<CompileDependsOn>
$(CompileDependsOn);
MyCustomTarget;
</CompileDependsOn>
</PropertyGroup>
<Target Name="MyCustomTarget">
<MyCustomTask />
</Target>

所以这做了我想做的,但我发现每当我加载项目文件时,它都会触发我的目标。我认为这只会在编译我的代码时运行。很明显,它正在编译或编译相关目标在项目文件加载时被触发。

理想情况下,我希望此目标仅在我明确构建项目时触发(即手动构建或开始调试时)。我可以做些什么不同的事情来实现这一目标?

最佳答案

从文档中可以看出,这些目标始终作为 Visual Studio 加载的一部分执行。这也将包括这些目标具有的任何依赖项。

Design-Time Target Execution

Visual Studio attempts to execute targets with certain names when it loads a project. These targets include Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths, and CopyRunEnvironmentFiles. Visual Studio runs these targets so that the compiler can be initialized to provide IntelliSense, the debugger can be initialized, and references displayed in Solution Explorer can be resolved. If these targets are not present, the project will load and build correctly but the design-time experience in Visual Studio will not be fully functional.

Source



比较运行时执行了哪些目标时 msbuild /v:diag /t:compile对比 msbuild /v:diag /t:build你会看到 ResGen并跳过了其他一些目标。尝试搭载其中之一可能对您有用。

还要记住有关 Visual Studio 托管过程及其对动态更改的文件的影响的以下内容:

Visual Studio 编译器可能正在使用文件的缓存版本。这会导致问题,要么在 obj 下明确创建文件文件夹并将它们动态包含在 MsBuild 中,这样 Visual Studio 就不会使用它的内存中文件实例。通过从 ItemGroup 中删除源文件并添加您自己生成的副本来执行此操作,您需要从自定义目标执行此操作:
<ItemGroup>
<Compile Remove="ThefileYourWantGone.cs" />
<Compile Include="$(BaseIntermediateOutputPath)\ThefileYourWantGone.g.cs/>
</ItemGroup>

除了硬编码,您还可以使用转换表达式:
<ItemGroup>
<Compile Include="ThefileYourWantGone.cs">
<IsRegenerated>true</IsRegenerated>
</Compile>
</ItemGroup>

<ItemGroup>
<RegeneratedCompile
Include="@(Compile)"
Condition="'%(Compile.IsRegenerated)' == 'true'"
/>
</ItemGroup>

<YourCustomtaskThatOutputs Inputs="@(RegeneratedCompile)" Outputs="@(RegeneratedCompile-> '$(BaseIntermediateOutputPath)\%(relativedir)%(filename).g.%(extension)')" />

<ItemGroup>
<Compile Remove="@(RegeneratedCompile)" />
<Compile Include="@(RegeneratedCompile-> '$(BaseIntermediateOutputPath)\%(relativedir)%(filename).g.%(extension)')" />
</ItemGroup>

备择方案

禁用主机编译器

disable the HostCompiler通过添加
<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

到第一个属性组(不应该有条件)以使 Visual Studio 始终使用磁盘版本(会稍微减慢 Visual Studio 的构建速度)。

使您的任务能够识别 Visual Studio

或者让你的构建任务知道 IVsMSBuildTaskFileManager并在您更新文件时告诉它。您需要注册 your build task in the registry of Visual Studio to flag it as "safe to load" .

关于visual-studio-2010 - MSBuild 目标,BeforeCompile,在加载项目文件时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080186/

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