Tôi không quan tâm một sự lặp lại thường xuyên của một cái gì đó khi nó là cần thiết, nhưng trong MSBuild tôi thực sự không biết làm thế nào để bao giờ tránh lặp lại. Nó không cung cấp "chức năng" theo nghĩa thông thường; một mục tiêu chỉ có thể được gọi một lần, thậm chí thông qua CallTarget
và <Import>
chỉ hoạt động ở mức Project
.Làm thế nào để tránh lặp lại trong MSBuild?
Dưới đây là một ví dụ cụ thể tôi đang cố gắng để De- "repetize":
<Target Name="Tgt1">
<PropertyGroup><Conf1>Twiddle</Conf1><Conf2>Thing</Conf2></PropertyGroup>
<PropertyGroup><xxxxxxxxxxExePath>$(xxxxxxxBuildRoot)\$(Conf1)Console-xxxxxxxxed</xxxxxxxxorExePath></PropertyGroup>
<MSBuild Projects="$(BuildSingleProj)" Targets="Build;Merge"
Properties="Configuration=$(Conf1)$(Conf2);Platform=$(Platform);CompiledFileName=$(CompiledFileName);ProjectName=$(ProjectName);SolutionFile=$(SolutionFile);Root=$(Root);Caller=$(MSBuildProjectFullPath)"/>
<MakeDir Directories="$(xxxxxxxxorExePath)" />
<WriteLinesToFile File="$(xxxxxxxxorExePath)\xxxxxxx.IsPortable.txt" />
<WriteLinesToFile File="$(xxxxxxxxorExePath)\xxxxxxx.Global.Settings.xml" Lines="@(xxxxxxxLicense)" Overwrite="true" />
<Exec Command='$(xxxxxxxxorExePath)\xxxxxxx.exe -a "$(xxxxxxxBuildRoot)\$(Conf1)$(Conf2)-Merged\xxxxxxx.exe" "$(xxxxxxxBuildRoot)\$(Conf1)$(Conf2)-xxxxxxxxed\xxxxxxx.exe"'/>
</Target>
Tôi có bốn mục tiêu như vậy, Tgt1
, Tgt2
, Tgt3
, Tgt4
. Chỉ chỉ điều khác biệt giữa bốn mục tiêu này là dòng đầu tiên, dòng đầu tiên xác định Conf1
và Conf2
.
Ý tưởng sao chép nhiều hơn hoặc ít khả thi hơn mà tôi biết là bằng cách di chuyển mã được chia sẻ sang một mục tiêu mới và gọi nó qua nhiệm vụ MSBuild
. Điều này, thật không may, yêu cầu một chuỗi thuộc tính loooooong được truyền theo cách thủ công và tác vụ này sử dụng khá ít (tôi đã đếm 11 thuộc tính và 1 nhóm mặt hàng).
Yêu cầu bổ sung là tôi có thể gọi tập lệnh bằng một tập hợp con tùy ý của các mục tiêu này, ví dụ: \t:Tgt2,Tgt3
.
Có bất kỳ giải pháp thay thế hợp lý nào để chỉ sao chép/dán đoạn mã này - không liên quan đến việc sao chép quanh danh sách lớn các thuộc tính thay thế không?
Nhưng điều này có nghĩa là tôi không còn có thể xây dựng chỉ một hoặc hai trong số chúng, đúng không? Bất kỳ cách nào để bảo tồn khả năng đó? –
Bạn có thể đặt điều kiện vào các mục. Tôi sẽ cập nhật câu trả lời với một ví dụ. –
Cảm ơn bạn, mặc dù tôi có thể thấy các điều kiện trở nên khá phức tạp nếu tôi muốn bao gồm bất kỳ _two_ bản dựng nào. Tôi hiện đang hướng tới việc giữ sự lặp lại bởi vì tôi muốn giữ khả năng chỉ định '/ t: Tgt1, Tgt2' - tập lệnh thực sự có thêm một vài mục tiêu, và chúng ta dựa vào khả năng chọn các tập con tùy ý như thế này. –