Description
Describe the bug
libman ignores ones of the definitions of the bootstrap dependency and prefers the last one defined (which brings in only the css files and not the js files as well in the desired location).
To Reproduce
Use the following libman json file contents:
{
"version": "1.0",
"defaultProvider": "jsdelivr",
"libraries": [
{
"provider": "cdnjs",
"library": "[email protected]",
"destination": "Scripts/jquery-validation-unobtrusive/"
},
{
"library": "[email protected]",
"destination": "Scripts/jquery-validation/",
"files": [
"dist/additional-methods.js",
"dist/additional-methods.min.js",
"dist/jquery.validate.js",
"dist/jquery.validate.min.js",
"dist/localization/messages_ar.js",
"dist/localization/messages_ar.min.js",
"dist/localization/messages_az.js",
"dist/localization/messages_az.min.js",
"dist/localization/messages_bg.js",
"dist/localization/messages_bg.min.js",
"dist/localization/messages_bn_BD.js",
"dist/localization/messages_bn_BD.min.js",
"dist/localization/messages_ca.js",
"dist/localization/messages_ca.min.js",
"dist/localization/messages_cs.js",
"dist/localization/messages_cs.min.js",
"dist/localization/messages_da.js",
"dist/localization/messages_da.min.js",
"dist/localization/messages_de.js",
"dist/localization/messages_de.min.js",
"dist/localization/messages_el.js",
"dist/localization/messages_el.min.js",
"dist/localization/messages_es.js",
"dist/localization/messages_es.min.js",
"dist/localization/messages_es_AR.js",
"dist/localization/messages_es_AR.min.js",
"dist/localization/messages_es_PE.js",
"dist/localization/messages_es_PE.min.js",
"dist/localization/messages_et.js",
"dist/localization/messages_et.min.js",
"dist/localization/messages_eu.js",
"dist/localization/messages_eu.min.js",
"dist/localization/messages_fa.js",
"dist/localization/messages_fa.min.js",
"dist/localization/messages_fi.js",
"dist/localization/messages_fi.min.js",
"dist/localization/messages_fr.js",
"dist/localization/messages_fr.min.js",
"dist/localization/messages_ge.js",
"dist/localization/messages_ge.min.js",
"dist/localization/messages_gl.js",
"dist/localization/messages_gl.min.js",
"dist/localization/messages_he.js",
"dist/localization/messages_he.min.js",
"dist/localization/messages_hr.js",
"dist/localization/messages_hr.min.js",
"dist/localization/messages_hu.js",
"dist/localization/messages_hu.min.js",
"dist/localization/messages_hy_AM.js",
"dist/localization/messages_hy_AM.min.js",
"dist/localization/messages_id.js",
"dist/localization/messages_id.min.js",
"dist/localization/messages_is.js",
"dist/localization/messages_is.min.js",
"dist/localization/messages_it.js",
"dist/localization/messages_it.min.js",
"dist/localization/messages_ja.js",
"dist/localization/messages_ja.min.js",
"dist/localization/messages_ka.js",
"dist/localization/messages_ka.min.js",
"dist/localization/messages_kk.js",
"dist/localization/messages_kk.min.js",
"dist/localization/messages_ko.js",
"dist/localization/messages_ko.min.js",
"dist/localization/messages_lt.js",
"dist/localization/messages_lt.min.js",
"dist/localization/messages_lv.js",
"dist/localization/messages_lv.min.js",
"dist/localization/messages_mk.js",
"dist/localization/messages_mk.min.js",
"dist/localization/messages_my.js",
"dist/localization/messages_my.min.js",
"dist/localization/messages_nl.js",
"dist/localization/messages_nl.min.js",
"dist/localization/messages_no.js",
"dist/localization/messages_no.min.js",
"dist/localization/messages_pl.js",
"dist/localization/messages_pl.min.js",
"dist/localization/messages_pt_BR.js",
"dist/localization/messages_pt_BR.min.js",
"dist/localization/messages_pt_PT.js",
"dist/localization/messages_pt_PT.min.js",
"dist/localization/messages_ro.js",
"dist/localization/messages_ro.min.js",
"dist/localization/messages_ru.js",
"dist/localization/messages_ru.min.js",
"dist/localization/messages_sd.js",
"dist/localization/messages_sd.min.js",
"dist/localization/messages_si.js",
"dist/localization/messages_si.min.js",
"dist/localization/messages_sk.js",
"dist/localization/messages_sk.min.js",
"dist/localization/messages_sl.js",
"dist/localization/messages_sl.min.js",
"dist/localization/messages_sr.js",
"dist/localization/messages_sr.min.js",
"dist/localization/messages_sr_lat.js",
"dist/localization/messages_sr_lat.min.js",
"dist/localization/messages_sv.js",
"dist/localization/messages_sv.min.js",
"dist/localization/messages_th.js",
"dist/localization/messages_th.min.js",
"dist/localization/messages_tj.js",
"dist/localization/messages_tj.min.js",
"dist/localization/messages_tr.js",
"dist/localization/messages_tr.min.js",
"dist/localization/messages_uk.js",
"dist/localization/messages_uk.min.js",
"dist/localization/messages_ur.js",
"dist/localization/messages_ur.min.js",
"dist/localization/messages_vi.js",
"dist/localization/messages_vi.min.js",
"dist/localization/messages_zh.js",
"dist/localization/messages_zh.min.js",
"dist/localization/messages_zh_TW.js",
"dist/localization/messages_zh_TW.min.js",
"dist/localization/methods_de.js",
"dist/localization/methods_de.min.js",
"dist/localization/methods_es_CL.js",
"dist/localization/methods_es_CL.min.js",
"dist/localization/methods_fi.js",
"dist/localization/methods_fi.min.js",
"dist/localization/methods_it.js",
"dist/localization/methods_it.min.js",
"dist/localization/methods_nl.js",
"dist/localization/methods_nl.min.js",
"dist/localization/methods_pt.js",
"dist/localization/methods_pt.min.js"
]
},
{
"provider": "cdnjs",
"library": "[email protected]",
"destination": "Scripts/jquery/"
},
{
"provider": "cdnjs",
"library": "[email protected]",
"destination": "Scripts/modernizr/",
"files": [
"modernizr.js"
]
},
{
"provider": "cdnjs",
"library": "[email protected]",
"destination": "Scripts/bootstrap/",
"files": [
"js/bootstrap.bundle.js",
"js/bootstrap.bundle.js.map",
"js/bootstrap.bundle.min.js",
"js/bootstrap.bundle.min.js.map",
"js/bootstrap.esm.js",
"js/bootstrap.esm.js.map",
"js/bootstrap.esm.min.js",
"js/bootstrap.esm.min.js.map",
"js/bootstrap.js",
"js/bootstrap.js.map",
"js/bootstrap.min.js",
"js/bootstrap.min.js.map"
]
},
{
"provider": "cdnjs",
"library": "[email protected]",
"destination": "Content/bootstrap/",
"files": [
"css/bootstrap-grid.css",
"css/bootstrap-grid.css.map",
"css/bootstrap-grid.min.css",
"css/bootstrap-grid.min.css.map",
"css/bootstrap-grid.rtl.css",
"css/bootstrap-grid.rtl.css.map",
"css/bootstrap-grid.rtl.min.css",
"css/bootstrap-grid.rtl.min.css.map",
"css/bootstrap-reboot.css",
"css/bootstrap-reboot.css.map",
"css/bootstrap-reboot.min.css",
"css/bootstrap-reboot.min.css.map",
"css/bootstrap-reboot.rtl.css",
"css/bootstrap-reboot.rtl.css.map",
"css/bootstrap-reboot.rtl.min.css",
"css/bootstrap-reboot.rtl.min.css.map",
"css/bootstrap-utilities.css",
"css/bootstrap-utilities.css.map",
"css/bootstrap-utilities.min.css",
"css/bootstrap-utilities.min.css.map",
"css/bootstrap-utilities.rtl.css",
"css/bootstrap-utilities.rtl.css.map",
"css/bootstrap-utilities.rtl.min.css",
"css/bootstrap-utilities.rtl.min.css.map",
"css/bootstrap.css",
"css/bootstrap.css.map",
"css/bootstrap.min.css",
"css/bootstrap.min.css.map",
"css/bootstrap.rtl.css",
"css/bootstrap.rtl.css.map",
"css/bootstrap.rtl.min.css",
"css/bootstrap.rtl.min.css.map"
]
}
]
}
Expected behavior
For libman to be smart enough to figure out that I want it to do the following:
- place all files within bootstrap's js folder in
Scripts/bootstrap
. - place all files within bootstrap's css folder in
Content/bootstrap
.
Screenshots
I do not think any screenshots are required, I just find this to be a pain and that there is no way for it to be like: ok, so you want the bootstrap files under its js folder to go to Scripts/bootstrap
, while for the same dependency for the css files to go to Content/bootstrap
(for this case it could just be smart enough to merge the 2 definitions together, in a way that does all of what the user intends to do.
Additional context
Visual Studio 2022 Version 17.6.0 Preview 2.0 (Note the library manager does not show up in the about dialog but it is in fact installed into my vs install).