Programming/C# & WPF

[.NET] dotnet nuget update source 오류 원인과 해결

Dean.Lee 2026. 11. 2. 01:48

dotnet nuget update source로 NuGet 패키지 소스의 주소를 바꾸려고 하면, Object reference not set to an instance of an object. 오류가 발생하면서 명령이 실패할 때가 있습니다. 아직 등록되지 않은 이름으로 소스를 업데이트하려고 하면 이 오류가 발생합니다. 이 메시지는 NullReferenceException이 발생했다는 뜻입니다. NullReferenceException은 .NET에서 null인 객체를 사용하려고 할 때 발생하는 예외입니다.

$ dotnet nuget update source MyFeed --source https://myfeed.example/v3/index.json
error: Object reference not set to an instance of an object.

MyFeed라는 소스가 없으니 원래는 "그런 이름의 소스를 찾을 수 없다"는 메시지가 출력되어야 합니다. 그런데 NuGet 버그 때문에 NullReferenceException 메시지가 대신 출력됩니다.

재현 환경과 결과

.NET SDK 10.0.103(NuGet 7.0.2)에서 재현했습니다. 사용자 설정을 건드리지 않도록 별도 nuget.config를 만들고 --configfile로 지정했습니다.

명령 상황 결과
update source 소스가 있음 성공
update source 소스가 없음 Object reference not set to an instance of an object.
add source 같은 이름이 있음 The name specified has already been added ...
add source 이름은 다르고 같은 URL이 있음 The source specified has already been added ...
remove source 소스가 없음 Unable to find any package source(s) matching name: ...

실패한 명령은 모두 종료 코드 1을 반환합니다. add는 소스가 이미 있으면 실패하고 update는 소스가 없으면 실패합니다. 그래서 어느 명령 하나만으로는 "소스가 있든 없든 이 주소로 맞춰 달라"는 일을 할 수 없습니다.

NuGet의 버그입니다

NuGet/Home 저장소에 같은 증상이 2026년 9월 26일에 #15094로 올라왔습니다. 소스를 찾지 못하면 그 객체는 null인데, null인지 확인하기 전에 그 객체의 속성부터 설정하는 코드가 원인이었습니다. 이슈에는 2024년 7월 커밋에서 생긴 회귀로 적혀 있고, NuGet 6.12부터 이 증상이 있습니다.

수정은 2026년 9월 29일 NuGet.Client PR #7744로 들어갔습니다. 수정된 버전에서는 remove와 같은 "Unable to find any package source(s) matching name" 메시지가 출력됩니다. 다만 2026년 11월 2일 기준으로 NuGet 릴리스 노트의 최신판은 7.10이고 이 수정이 들어간 버전은 아직 배포되지 않았습니다. 수정된 버전이 배포되어도 바뀌는 것은 메시지뿐입니다. 없는 소스를 update하면 여전히 실패합니다.

반응형

해결 방법: 소스가 있는지 먼저 확인합니다

소스가 이미 있으면 update하고 없으면 add합니다. 이렇게 하면 스크립트를 몇 번 실행해도 같은 결과가 나옵니다.

소스 이름으로 확인하려면 dotnet nuget list source의 기본 출력 형식을 사용합니다. --format short는 이름 없이 URL만 보여 주기 때문에 이름을 확인하는 데에는 사용할 수 없습니다.

if dotnet nuget list source --configfile ./nuget.config | grep -qE '^\s+[0-9]+\.\s+MyFeed \['; then
  dotnet nuget update source MyFeed --source "$FEED_URL" --configfile ./nuget.config
else
  dotnet nuget add source "$FEED_URL" -n MyFeed --configfile ./nuget.config
fi

이 방법은 소스에 딸린 설정을 건드리지 않고 주소만 바꿉니다. 인증 정보(packageSourceCredentials)와 disable source로 꺼 둔 상태도 그대로 남습니다. 꺼 둔 소스도 목록에는 나오므로 update 쪽으로 처리됩니다.

다른 방법: 지우고 다시 추가합니다

스크립트를 더 짧게 작성하고 싶다면 소스를 지운 뒤 다시 추가하는 방법도 있습니다. 소스가 없어서 지우기에 실패해도 무시하고 넘어갑니다.

dotnet nuget remove source MyFeed --configfile ./nuget.config > /dev/null 2>&1 || true
dotnet nuget add source https://myfeed.example/v3/index.json -n MyFeed --configfile ./nuget.config

두 번 연속 실행해도 매번 Package source with Name: MyFeed added successfully.로 끝납니다.

PowerShell에서는 이렇게 작성합니다.

dotnet nuget remove source MyFeed --configfile ./nuget.config *> $null
dotnet nuget add source https://myfeed.example/v3/index.json -n MyFeed --configfile ./nuget.config
if ($LASTEXITCODE -ne 0) { throw "NuGet 소스 등록 실패" }

다만 remove는 소스에 딸린 설정도 함께 지웁니다. 확인해 보면 두 가지가 사라집니다.

  • 인증 정보: packageSourceCredentials 항목이 지워집니다. 사설 피드라면 add에 -u와 -p를 다시 넘겨야 합니다.
  • 비활성 상태: disable source로 꺼 둔 소스를 지우고 다시 추가하면 켜진 상태가 됩니다.

인증이 필요한 피드라면 add 한 줄에 인증 정보까지 넣어서 한 번에 맞춥니다. 비밀번호는 스크립트에 직접 적지 말고 CI의 비밀 변수에서 읽어 옵니다.

dotnet nuget add source "$FEED_URL" -n MyFeed -u "$FEED_USER" -p "$FEED_TOKEN" \
  --store-password-in-clear-text --configfile ./nuget.config

소스에 딸린 설정을 지켜야 한다면 먼저 확인하는 방법을 사용합니다. CI처럼 매번 인증 정보까지 새로 넣는 환경이라면 지우고 다시 추가하는 방법이 더 간단합니다.

반응형