【问题标题】:Using CreateCSharpAssemblyInfo throws an error : FAKE- F#MAKE使用 CreateCSharpAssemblyInfo 会引发错误:FAKE- F#MAKE
【发布时间】:2025-11-22 05:15:02
【问题描述】:

我正在使用 FAKE 的“CreateCSharpAssemblyInfo”函数来更新 AssemblyInfo.cs。 但我收到错误,即

  2) CS0579: Properties\AssemblyInfo.cs: Duplicate 'AssemblyProductAttribute' attribute
  3) CS0579: Properties\AssemblyInfo.cs: Duplicate 'AssemblyCompanyAttribute' attribute
  4) CS0579: Properties\AssemblyInfo.cs: Duplicate 'AssemblyCopyrightAttribute' attribute
  5) CS0579: Properties\AssemblyInfo.cs: Duplicate 'AssemblyVersionAttribute' attribute
  6) CS0579: Properties\AssemblyInfo.cs: Duplicate 'AssemblyFileVersionAttribute' attribute

这是我正在使用的代码:

let assemblyInfo = [
  Attribute.Title "My Project"
  Attribute.Product "My Product"
  Attribute.Company "XYZ"
  Attribute.Copyright "Copyright XYZ"
  Attribute.Version "14.8"
  Attribute.FileVersion "13.9"
]

Target "BuildApp" (fun _ ->
  CreateCSharpAssemblyInfo  "./Source Code/Project/Properties/AssemblyInfo.cs" assemblyInfo
  !! "/Source Code/Project.sln"
      |> MSBuildReleaseExt buildDir [("SolutionDir", currentPath @@ "\BuildTools")] "Build"
      |> Log "AppBuild-Output:"
)

我没有得到这个错误的原因。

我是 FAKE 的新手,没有太多使用 F#,如果这很明显,请原谅我。

如果有人可以提供帮助,那将是非常有帮助的。

【问题讨论】:

  • CreateCSharpAssemblyInfo 没有抛出错误,MSBuild 是。一旦失败,在 VS 中打开解决方案并在那里构建 - 它也会失败。您应该能够找到问题所在 - 例如,您可能在项目引用的另一个文件中定义了这些属性。
  • dotnet core 会自动为您生成这些程序集属性,这与 FAKE 中的属性冲突
  • @Charles Mager:它并没有从 VS 失败。
  • @Foole:是的,我想这可能是这个原因,那么有什么解决办法吗?
  • @johnfernandes 有几个选项 - 将属性值添加到您的项目文件中,将它们指定为 MSBuild 参数,或禁用属性生成(我无法做到最后一个)

标签: f# f#-3.0 f#-fake


【解决方案1】:

你试过CreateCSharpAssemblyInfoWithConfigargument 吗?它允许一个额外的参数:

CreateCSharpAssemblyInfoWithConfig
        assemblyInfoFile
        attributes
        (AssemblyInfoFileConfig(generateClass=false))

或者,UpdateAttribute 会做类似的事情(在我的情况下,所有开发人员都在 Visual Studio 中工作,可以安全地假设默认的AssemblyInfo.cs 文件将自动生成)。 来自doc

更新 AssemblyInfo 文件中的一组属性。如果未找到任何属性,则失败。

见下例:

Target "UpdateAssemblyInfo" (fun _ -> 
    let csProjectDirs =
        !! "**/**/*.csproj"
        |> Seq.map (directory >> directoryInfo)

    let attributes =
        [ 
            Attribute.Title "My Project"
            Attribute.Product "My Product"
            Attribute.Company "XYZ"
            Attribute.Copyright "Copyright XYZ"
         ]
    let applyAssemblyInfo (projDir:DirectoryInfo) = 
        let assemblyInfoFile = projDir.FullName @@ "Properties/AssemblyInfo.cs"
        clearReadOnly assemblyInfoFile
        UpdateAttributes
            assemblyInfoFile
            attributes

    csProjectDirs |> Seq.iter applyAssemblyInfo
)

【讨论】:

    最近更新 更多