Skip to content

NETSDK1152 エラー: 同じ相対パスの複数の公開出力ファイルが見つかりました

問題の概要

.NET 6以降のプロジェクトでdotnet publishを実行する際に、次のようなエラーが発生することがあります:

error NETSDK1152: Found multiple publish output files with the same relative path: 
[ファイルパス1], [ファイルパス2]

このエラーは、異なるプロジェクトに同じ名前のファイルが存在し、それらが同じ出力ディレクトリにコピーされようとすると発生します。

よくある重複ファイルの例

  • appsettings.json - 複数のプロジェクトで使用される設定ファイル
  • compilerconfig.json - SCSSコンパイル設定ファイル
  • package.json - Node.jsパッケージ設定ファイル
  • packages.lock.json - NuGetパッケージロックファイル
  • libman.json - ライブラリマネージャー設定ファイル

エラーの原因

このエラーは**.NET 6 SDKで導入された新しいセキュリティ機能**によるものです。以前のバージョンでは同名ファイルが上書きされていましたが、.NET 6以降では意図しないファイルの上書きを防ぐためにこのチェックが追加されました。

背景

Microsoftの公式ドキュメント「Duplicate files in output」で詳細が説明されています。

解決方法

方法1: 特定のファイルを公開から除外する

不要なファイルが公開されないようにプロジェクトファイルを設定します:

xml
<!-- .csprojファイルに追加 -->
<ItemGroup>
  <Content Remove="compilerconfig.json;package.json;libman.json"/>
  <None Include="compilerconfig.json;package.json;libman.json">
    <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </None>
</ItemGroup>

方法2: ビルドアクションを変更する(Visual Studio)

Visual Studioでファイルのプロパティを変更する方法:

  1. ソリューションエクスプローラーで対象ファイルを右クリック
  2. 「プロパティ」を選択
  3. 以下のように設定:
    • ビルド アクション: None(なし)
    • 出力ディレクトリにコピー: コピーしない

Visual Studioでの設定例

方法3: エラーチェックを無効にする(一時的な対策)

プロジェクトファイルに以下の設定を追加して、エラーチェックを無効にします:

xml
<PropertyGroup>
  <ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles>
</PropertyGroup>

注意

この方法はエラーを無視するだけなので、根本的な解決にはなりません。他の方法が適用できない場合の最終手段としてください。

方法4: 必要な場合のみ出力ディレクトリにコピーする

開発時は必要だが、公開時には不要なファイル(例:Entity Frameworkのappsettings.json)の場合:

xml
<ItemGroup>
  <Content Include="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </Content>
</ItemGroup>

特定のシナリオ別の解決策

Azure DevOps パイプラインでの問題

パイプラインでNuGetキャッシュを使用している場合、packages.lock.jsonファイルの重複でエラーが発生することがあります:

yaml
- task: UseDotNet@2
  displayName: 'Install .NET SDK version'
  inputs:
    packageType: sdk
    version: 6.0.300
    installationPath: $(Agent.ToolsDirectory)/dotnet

Dockerビルド時の対処法

Dockerfile内でビルド前に重複ファイルを削除:

dockerfile
COPY . .
RUN find ${PROJECT_PATH} -iname "appsettings*.json" -exec rm {} \;
RUN dotnet publish ${PROJECT}/*.csproj --configuration Release --output out --no-restore

NServiceBus を使用している場合

SQLスクリプト生成が原因の場合は、プロジェクトファイルに以下を追加:

xml
<PropertyGroup>
  <SqlPersistenceGenerateScripts>false</SqlPersistenceGenerateScripts>
</PropertyGroup>

根本的な原因への対処

プロジェクト参照の確認

不要なプロジェクト参照がエラーの原因になっていることがあります:

  1. ソリューションエクスプローラーでプロジェクト参照を確認
  2. 不要な参照を削除
  3. 必要なコードは別途クラスライブラリに分離

NuGet パッケージのバージョン統一

異なるバージョンの同じNuGetパッケージを使用していると問題が発生することがあります:

  1. Visual Studioで「ツール」>「NuGet パッケージ マネージャー」>「ソリューションのNuGet パッケージの管理」を開く
  2. 「統合」タブでバージョンの不一致を確認
  3. 統一したいバージョンを選択して「インストール」

NuGetパッケージの統一

予防策

  1. 開発時から意識する: プロジェクト構造を設計する段階でファイルの重複を避ける
  2. 共通ファイルは共有プロジェクトに: 複数プロジェクトで必要な設定ファイルは共通プロジェクトに配置
  3. 定期的なメンテナンス: 不要なプロジェクト参照やファイルを定期的に確認・整理

まとめ

NETSDK1152エラーは.NET 6のセキュリティ強化によるもので、根本的にはプロジェクト構造の改善が必要な場合が多いです。一時的な対策としてErrorOnDuplicatePublishOutputFilesを無効にする方法もありますが、可能な限りファイルの重複を解消する根本的な解決を目指しましょう。

重要

このエラーは.NET 6 SDKの機能によるもので、対象フレームワークのバージョンとは関係ありません。Visual Studio 2022は.NET 6 SDKを含んでいるため、旧バージョンの.NETを対象とするプロジェクトでもこのエラーが発生する可能性があります。