时间:2026-03-02 18:01
人气:
作者:admin
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
一个项目中,存在部分库是公司内的,且需要配置个人的用户名和密码连接到 NuGet 站点,才能下载这些库。
而有时候需要直接把一个仓库拉到某个环境上进行编译,且不希望把带了密码的 NuGet.Config 文件提交到代码仓库中。
能不能把公司内的库放到类似 golang 的 vendor 目录下?然后编译机器拉到仓库后就能直接编译,而不再依赖公司的 NuGet 站点了。
下面是我的做法:
在项目根目录中定义一个配置完整的 NuGet.Config 文件,取名为: NuGet.Config.for.download
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="Internal" value="https://my.company.com/repository/xxxx/" />
</packageSources>
<packageSourceMapping>
<!-- Private packages should resolve from private feeds -->
<packageSource key="Internal">
<package pattern="MyCompany.*" />
</packageSource>
<!-- Public packages resolve from nuget.org -->
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
<packageSourceCredentials>
<Internal>
<add key="Username" value="${USER}" />
<add key="ClearTextPassword" value="${PASSWORD}" />
</Internal>
</packageSourceCredentials>
</configuration>
这个文件用于第一次使用时下载库,这个文件不必提交到仓库。
mkdir -p ./vendor/public/
dotnet restore --configfile ./NuGet.Config.for.download --packages ./vendor/public/
指定配置文件,把所有依赖项下载到 /vendor/public/ 目录。
下载好后,把公司内部的库移动到另一个目录:
rm -fdr ./vendor/private/ ; mkdir -p ./vendor/private/ && \
mv ./vendor/public/MyCompany.* ./vendor/private/
新增一个专门用于 vendor 模式的 NuGet.Config 配置文件,取名为:NuGet.Config.vendor
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="Internal" value="./vendor/private/" />
</packageSources>
<packageSourceMapping>
<!-- Private packages should resolve from private feeds -->
<packageSource key="Internal">
<package pattern="MyCompany.*" />
</packageSource>
<!-- Public packages resolve from nuget.org -->
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
dotnet restore --configfile ./NuGet.Config.vendor -r linux-x64
dotnet publish MyProj.csproj \
--no-restore \
-c Debug -r linux-x64 \
-o ./build/linux/amd64/
最关键的参数是 --no-restore
docker run --rm \
--platform linux/amd64 \
-v "./":/src \
-w /src/ \
mcr.microsoft.com/dotnet/sdk:8.0 \
bash -c ' \
dotnet restore --configfile ./NuGet.Config.vendor -r linux-x64 && \
dotnet publish MyProj.csproj \
--no-restore \
-c Debug -r linux-x64 \
-p:PublishAot=false \
-p:PublishSingleFile=false \
-p:IncludeNativeLibrariesForSelfExtract=true \
-p:EnableCompressionInSingleFile=true \
-p:GenerateDocumentationFile=false \
-p:StripSymbols=false \
-p:DebugType=portable \
-p:DebugSymbols=true \
-p:EmbedUntrackedSources=true \
-p:EmbedAllSources=true \
-p:ContinuousIntegrationBuild=true \
-p:Optimize=false \
-o /src/build/linux/amd64/ \
'
.gitignore 文件中增加一些配置:
NuGet.Config.for.download # 用于下载的文件,不提交到仓库,里面有密码
/vendor/public/ # public 文件太多了,不提交到仓库
!/vendor/private/ # 说明这个目录一定要提交
!/vendor/private/**/*nupkg # .nupkg 类型的文件一定要提交
好了,在别的环境 git clone 后,使用上述提到的编译命令行就可以编译了。
希望对你有用, Have fun. ????
如何在 DotNet 中使用类似 golang 的 vendor 的