azure-devopsmsbuildweb-publishing

MSBuild with WebPublishMethod to package produces wrong file names in zip file


We have standard CI/CD on Azure DevOps. Recently we found, that files with diacritics (accent) in names are published wrong. Seems that instead of original chars all is in utf-8 (or something like that).

In build phase the is normal Visual Studio Build task with common msbuild command and arguments

/t:XXX /p:BuildProjectReferences=true /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactstagingdirectory)\XXX" /p:outputDir="$(build.artifactstagingdirectory)\XXX" /P:PackageTempRootDir=

After build, zip file contains encoded filenames. So encoding is part of build process.

Tried to simply call msbuild and publish to package from local machine on sample project and the same problem. Output zip package contains encoded filenames. And now it is impossible to extract zip file to get original naming.

My question is - how to force build and package task to not encode names, or use extract zip task to get filanames as they are in project? I found no info how to extract encoded files from artifacts.


Solution

  • Recently we found, that files with diacritics (accent) in names are published wrong.

    Based on my test, I could reproduce this issue. When the Folder Name or File name contain the diacritics, their names will be encoded into other formats after Msbuild.

    For example:

    enter image description here

    As you said, this problem also exists in the local msbuild, so this problem exists in msbuild itself. Since the SDK used by msbuild may be of a lower version, it cannot recognize these special characters

    I am afraid that there is no such arguments in msbuild to force the original encoding of the file to be maintained.

    Workaround1:

    In Azure Devops, you could use Extract files task to unzip the zip file.

    Then you could use Powershell task to run the script to change the file or folder name:

    Folder:

    Rename-Item 'C:\xxx\diakritik├│s'  -newName 'C:\xxxm\diakritikós'
    

    File:

    Rename-Item -Path "c:\logfiles\daily_file.txt" -NewName "monday_file.txt"
    

    Finally, you could use Archive files task to zip the files again.

    Sample:

    enter image description here

    Workaround2:

    Based on my test, you could use template for dotnet build.

    enter image description here

    In this case, dotnet build can keep the file name.

    For the issue itself, I suggest you can report it here: Msbuild Issue.