Introduction

The package contains one or more duplicated files in the same folder.

というメッセージが表示され、パッケージをpublishできない。

nuget

後述するが、問題を調べるためのサンプルプログラムを作った。

NugetCheck

Why?

このメッセージで検索するも、ヒットするのは nuget の公式リポジトリか何かのソース。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        private PackageValidationResult CheckPackageDuplicatedEntries(PackageArchiveReader nuGetPackage)
{
if (ValidationHelper.HasDuplicatedEntries(nuGetPackage))
{
return PackageValidationResult.Invalid(Strings.UploadPackage_PackageContainsDuplicatedEntries);
}

return null;
}

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Linq;
using NuGet.Packaging;

namespace NuGetGallery.Helpers
{
public class ValidationHelper
{
public static bool HasDuplicatedEntries(PackageArchiveReader nuGetPackage)
{
// Normalize paths and ensures case sensitivity is also considered
var packageFiles = nuGetPackage.GetFiles().Select(packageFile => FileNameHelper.GetZipEntryPath(packageFile));

return packageFiles.Count() != packageFiles.Distinct(StringComparer.OrdinalIgnoreCase).Count();
}
}
}

ソースが入っているリポジトリは NuGet Gallery で、恐らく公式のnugetページのソース。

なので、このソースで上のコードを実行すれば、何が問題かがわかるはず。

結論から言って、原因は

1
2
3
<file src="../../src/XXXX/bin/Release/netstandard2.0/XXXX.dll" target="lib/netstandard2.0" />

<file src="..\..\src\XXXX\bin\Release\netstandard2.0\XXXX.dll" target="lib\netstandard2.0" />

/\ でパスが別者扱いされていたのが原因。