如何让 MSBuild 目标在输入文件更改时运行?

问题描述 投票:0回答:1

嗨,我对 MSBuild 还很陌生,所以任何反馈都非常有帮助。我正在尝试执行一个构建步骤来编译任何 *.less 文件以与 Blazor 一起使用。我以前使用过 WebCompiler,但它不适用于非 Windows 机器。

我创建了一个 less 构建任务,如下所示:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>LessCompile</Name>
    </PropertyGroup>

    <Target Name="RazorLessCompile" BeforeTargets="ResolveScopedCssInputs" Inputs="@(RazorLessFile)" Outputs="@(RazorLessFile->'%(RelativeDir)%(Filename).css')">

        <Exec ContinueOnError="true" IgnoreExitCode="true" Command='npx lessc %(RazorLessFile.Identity) %(RazorLessFile.RelativeDir)%(RazorLessFile.Filename).css --autoprefix="defaults"' />

        <!--
        This is required for compiled css to be picked up by Razor.ScopedCss.targets 
        Without this, we will get the build error 'Could not find a part of the path '**\Debug\net5.0\scopedcss\projectbundle'.'
        -->
        <ItemGroup>
            <None Remove="%(RazorLessFile.RelativeDir)%(RazorLessFile.Filename).css" />
            <None Include="%(RazorLessFile.RelativeDir)%(RazorLessFile.Filename).css" />
        </ItemGroup>
    </Target>

    <Target Name="LessCompile" BeforeTargets="ResolveStaticWebAssetsConfiguration;ResolveScopedCssInputs" Inputs="@(LessFile)" Outputs="@(LessFile->'%(CompileTo)')">
        <Exec ContinueOnError="true" IgnoreExitCode="true" Command='npx lessc %(LessFile.Identity) %(CompileTo) --autoprefix="defaults"' />
    </Target>

    <Target Name="AddStaticAssets" DependsOnTargets="LessCompile" BeforeTargets="ResolveStaticWebAssetsConfiguration;ResolveScopedCssInputs">
        <ItemGroup>
            <Content Remove="wwwroot/**" />
            <Content Include="wwwroot/**" />
        </ItemGroup>
    </Target>
</Project>

然后我在我的项目文件中使用它,如下所示:

    <ItemGroup>
        <RazorLessFile Include="**/*.razor.less" />     
        <LessFile Include="Styles/app.less">
            <CompileTo>wwwroot/css/app.css</CompileTo>
        </LessFile>
        <LessFile Include="Styles/breezer-overrides.less">
            <CompileTo>wwwroot/css/breezer-overrides.css</CompileTo>
        </LessFile>
    </ItemGroup>

    <Import Project="..\..\LessCompile.targets" />

我发现每次我想要重新编译我的 less 时都必须重建。有没有办法让编译器运行任何输入文件更改,而不需要构建?

msbuild less
1个回答
0
投票

每当调用 MSBuild 来构建项目时,它都会这样做并在完成后退出。尽管实例可能保留在后台进行缓存,但它不再熟悉该项目,并且不会对任何更改做出反应,除非请求另一个构建。因此,MSBuild 不支持查看文件然后开箱即用地重建。

我建议使用现有工具或编写一个简短的脚本来监视文件并在文件更改时调用 MSBuild。如果可能,请添加冷却时间,因为构建通常不是免费的,如果请求太频繁,可能会降低 IDE 的速度。

© www.soinside.com 2019 - 2024. All rights reserved.