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.exebạ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|x64và Release|x86riêng biệt. Vì vậy, tôi đã tính cả hai. Nhưng để hỗ trợ dotnet publishlệnh xây dựng bài đăng , trước tiên tôi đã thêm vào RuntimeIdentifiertệ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\Debughoặ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\Releasehoặ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.execầ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 publishlà 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.