代码之家  ›  专栏  ›  技术社区  ›  André Polykanine

MSB4067无法识别元素<Target>下方的元素<WriteLinesToFile>

  •  0
  • André Polykanine  · 技术社区  · 10 月前

    原始问题

    我有一个 目录。构建目标 当使用Release配置构建时,该文件将增加项目版本的构建编号。即,产品版本为 1.0.0.0 ,当内置于Release配置中时,此目标将使其 1.0.0.1 ,等等。由于某种原因,我收到了这个错误:

    MSB4067 The element <WriteLinesToFile> beneath element <Target> is unrecognized.
    

    代码

    <Project Sdk="Microsoft.NET.Sdk">
        <Target Name="IncrementBuildNumber" BeforeTargets="GenerateAssemblyInfo" Condition="'$(Configuration)' == 'Release'">
            <PropertyGroup>
                <VersionFile>$(MSBuildThisFileDirectory)version.txt</VersionFile>
            </PropertyGroup>
    
            <ReadLinesFromFile File="$(VersionFile)">
                <Output TaskParameter="Lines" ItemName="VersionLines"/>
            </ReadLinesFromFile>
    
            <PropertyGroup>
                <VersionString>%(VersionLines[0])</VersionString>
                <MajorVersion>$([System.String]::Split($(VersionString), '.')[0])</MajorVersion>
                <MinorVersion>$([System.String]::Split($(VersionString), '.')[1])</MinorVersion>
                <PatchNumber>$([System.String]::Split($(VersionString), '.')[2])</PatchNumber>
                <BuildNumber>$([System.String]::Split($(VersionString), '.')[3])</BuildNumber>
            </PropertyGroup>
    
            <PropertyGroup>
                <NewBuildNumber>$([System.Int32]::Parse($(BuildNumber)) + 1)</NewBuildNumber>
                <NewVersion>$(MajorVersion).$(MinorVersion).$(PatchNumber).$(NewBuildNumber)</NewVersion>
            </PropertyGroup>
    
            <WriteLinesToFile File="$(VersionFile)" Overwrite="true">
                $(NewVersion)
            </WriteLinesToFile>
    
            <PropertyGroup>
                <Version>$(NewVersion)</Version>
            </PropertyGroup>
        </Target>
    </Project>
    

    更新问题

    由于第一个答案,原始错误得以解决。然而,现在我面临着一个奇怪的问题,我无法评估 old version + 1 表达。两者都没有 System.Convert ,也不是 System.Int32.Parse 在此MSBuild场景中不起作用。
    问题是:这是实施它的正确和最无痛的方法吗?如果没有,考虑到我希望它在Windows上的本地构建和CI中也能工作,最简单的方法是什么?

    1 回复  |  直到 10 月前
        1
  •  2
  •   James Cockayne    10 月前

    我认为写操作的内容需要作为 Lines 属性而不是身体。 <WriteLinesToFile File="$(VersionFile)" Overwrite="true" Lines="$(NewVersion)" />

    我以此作为参考 https://learn.microsoft.com/en-us/visualstudio/msbuild/writelinestofile-task?view=vs-2022#example

    这只是猜测,我还没有测试过!