所以这里是场景:我有几个 wix 项目,它们具有完全相同的额外 msbuild 目标和任务来自动执行一些非常乏味的任务:例如构建帮助文件和使用 signtool.exe 对 msi 和输出文件进行签名的验证码。
每次修复时都厌倦了将这些脚本的更改复制到 5 个不同的存储库中。所以我变聪明了,我把它们变成了 nuget 包,在 build 文件夹中有一个 .targets 文件。一个简单的 nuget restore 将包的清单变成目标文件。
问题 维克斯V3不喜欢的包。它不支持包引用,所以 packages.config 看起来像这样。除了visual studio 不喜欢packages.config。它会很高兴地恢复包(到我用 nuget.config 指定的文件夹中),但没有自动导入 .targets 文件。
很容易修复:我刚刚在我的 wixproj 文件中添加了一个导入语句。除了visual studio在运行恢复操作后不会自动重新评估wixproj。我们可以解决这个问题,但是每次包更改时都必须构建、卸载项目、重新加载项目和重新构建,这真的很烦人。
所以我试图修复它
我爬过标准 C# 项目构建的日志输出并发现了 Nuget.Targets 文件,该文件可以导入到项目中以提供pack和restore定位。它还让我可以转换为 packagereferences,这比packages.config 更方便也更简洁,但我仍然需要手动为 nuget.g.targets 和 nuget.g.props 文件添加导入语句restore目标。
而且,由于我必须手动导入这些文件,我又回到了构建、卸载、重新加载、重建工作流程。
第 2 次尝试
我通过密集的 Internet 搜索发现 msbuild 最近/restore在其命令行实用程序中添加了一个标志,专门用于在恢复包后强制重新评估项目。这适用于命令行,但视觉工作室似乎毫无头绪。(也许是因为 wix v3 在 Visual Studio 模板中在幕后做了一些事情?)无论如何,他们在问题说明中提到他们本质上是使用具有新全局属性的 msbuild 任务来强制重新评估。所以我试图在我的 wixproj 的预构建事件中添加这样一个步骤,但没有酱。
在运行恢复后,如何告诉 Visual Studio 重新评估此 wixproj?是否需要将某种属性或项目组添加到 …
因此,基本上我在 C# 中实现 MultiMap,并且采用了显而易见的方法:使用使用 List 作为值的 Dictionary 对象。接下来,我需要返回键值对的扁平列表:List<KeyValuePair<TKey, TValue>>。使用循环来完成这件事还不错,但我很好奇如何使用 Linq 来完成这件事。
我使用 SelectMany 函数接近了,但我不太清楚如何从 A 点到 B 点。这是我的代码,无需 Linq 即可完成此操作(减去您不关心的其他位)。
public class MultiDict<TKey, TValue>
{
private Dictionary<TKey, List<TValue>> _dict = new Dictionary<TKey, List<TValue>>();
public void AddValue(TKey key, TValue val)
{
List<TValue> list;
if (_dict.ContainsKey(key))
{
list = _dict[key];
}
else
{
list = new List<TValue>();
_dict.Add(key, list);
}
list.add(val);
}
public KeyValuePair<TKey, TValue>[] Flattened()
{
var flattened = new List<KeyValuePair<TKey, TValue>>();
foreach (var pair in _dict)
{
//pair.Value …Run Code Online (Sandbox Code Playgroud)