Tôi đã "giải quyết" (tạo ra công việc xung quanh) điều này theo cách đơn giản hơn.
Trong bài xây dựng
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
là thư mục mà bạn muốn nội dung đã xuất bản của mình được sắp xếp
LƯU Ý: tùy thuộc vào phiên bản dotnet.exe
bạn sử dụng, lệnh--no-build
có thể không khả dụng.
Ví dụ, không có sẵn trong v2.0.3; và có sẵn trong v2.1.402. Tôi biết rằng VS2017 Update4 có v2.0.3. Và Update8 có 2.1.x
Cập nhật:
Thiết lập ở trên sẽ hoạt động trong môi trường gỡ lỗi cơ bản nhưng để đưa nó vào môi trường máy chủ / sản xuất xây dựng thì cần nhiều hơn thế. Trong ví dụ cụ thể này mà tôi phải giải quyết, chúng tôi xây dựng Release|x64
và Release|x86
riêng biệt. Vì vậy, tôi đã tính cả hai. Nhưng để hỗ trợ dotnet publish
lệnh xây dựng bài đăng , trước tiên tôi đã thêm vào RuntimeIdentifier
tệp dự án.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
Tại sao tôi cần nó và tại sao bạn có thể bỏ đi mà không có nó? Tôi cần điều này vì chương trình xây dựng của tôi được đặt thành cảnh báo chặn MSB3270 và không xây dựng được nếu nó xuất hiện. Cảnh báo này cho biết, "này, một số tệp trong phần phụ thuộc của bạn có định dạng sai". Nhưng bạn có nhớ mục tiêu của bài tập này không? Chúng ta cần kéo các tệp DLL phụ thuộc gói. Và trong nhiều trường hợp, nó không quan trọng nếu cảnh báo này có ở đó bởi vì việc xây dựng bài đăng sau không quan tâm. Một lần nữa, đây là chương trình xây dựng của tôi quan tâm. Vì vậy, tôi chỉ thêmRuntimeIdentifier
vào 2 cấu hình tôi sử dụng trong quá trình xây dựng sản xuất.
Toàn bài xây dựng
if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y
if $(ConfigurationName) == Release (
dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)
xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R
Giải thích: dotnet xuất bản đang tìm kiếm obj\Debug
hoặc obj\Release
. Chúng tôi không có nó trong quá trình xây dựng vì quá trình xây dựng tạo ra obj\x64\Release
hoặc obj\x86\Release
. Dòng 1 và 2 giảm thiểu vấn đề này. Trong dòng 3, tôi yêu dotnet.exe
cầu sử dụng cấu hình cụ thể và thời gian chạy mục tiêu. Nếu không, khi đây là chế độ gỡ lỗi, tôi không quan tâm đến nội dung thời gian chạy và cảnh báo. Và ở dòng cuối cùng, tôi chỉ cần lấy dlls của mình và sao chép sau đó vào thư mục đầu ra. Công việc hoàn thành.
dotnet publish
là một hack? Bao gồm lệnh trong tệp csproj của bạn dưới dạng tập lệnh tạo bài đăng.