我已经接管了包含许多c#项目的Web解决方案的维护。在编译时,一个项目按预期在其输出目录bin文件夹下创建Roslyn bin文件夹,而另一个项目在C:\ bin \ roslyn中创建Roslyn bin文件夹。我已经在项目文件中搜索了有关为什么发生这种情况的任何线索,但找不到任何引用。在构建日志中,它显示了在其输出目录下创建Roslyn文件夹的项目时,使用绝对目标路径(C:\ project output dir \ bin \ Roslyn)复制文件,而在创建该目录的项目下C:\ bin \ Roslyn,列出的文件只是复制到\ bin \ Roslyn。项目设置应指向输出目录(设置$(OutputDir))。任何指针将不胜感激。
答案 0 :(得分:0)
我知道调查MSBuild问题的3种方法:
通常,我发现二进制日志(binlog)最有用。通过传递-bl
创建一个文件,然后在MSBuild Structured Log Viewer中打开生成的文件。它显示了与构建日志非常相似的数据,但是具有很好的搜索功能,并在树状视图中显示了所发生的情况,极大地帮助了理解。
对于该特定问题,我认为对您来说最有用的是通过运行msbuild -pp
或dotnet msbuild -pp
输出预处理文件。基本上,这将找到所有MSBuild Import
语句,并将其替换为导入文件的实际内容。我相信MSBuild始终对自顶向下进行评估。因此,如果定义了property1,然后将其用于评估property2,然后稍后对property1进行更改,则property2的值将保留其从评估时起的值。请记住,执行目标会导致对目标进行评估,因此,只要先运行较低目标,或者下一个定义的属性或项目是全局的,它就可以使用在文件下方定义的属性(不在目标中。
最后,如果其他所有操作均失败,则可以尝试将日志输出设置为最高详细级别(诊断)。请注意,msbuild -v:d
是详细的详细信息,您需要msbuild -v:diag
来设置诊断详细信息。我不确定这是否实际输出的内容超过binlog中的内容,但我认为我可能绝望了一两次,并且diag输出有所帮助(但我不记得我是否在其中使用了binlog。场合)。无论如何,如果上面的其他两种方法没有帮助,值得尝试。
答案 1 :(得分:0)
由于使用了指针,Icepickle在询问是否存在问题时是正确的,该解决方案可以解决,但根驱动器上只有一个多余的文件夹,因此并不理想。我已经通过解决方案构建(在Diagnostic Verbosity中)对问题进行了排序,并且在将文件复制到根文件夹的所有项目中,我在其项目文件中添加了以下内容。这将指向正确的路径,并且仅在文件不存在的情况下才会复制。
const pool = await orient.getPool();
const session = await pool.acquire();
logger.info('Running query...');
session.command(`SELECT out('Access').out("Contain") FROM Client WHERE myId = 30543`)
.on('data', (data) => {
if (data.out_Contain && data.out_Contain.delegate) {
logger.info('Segment %s contains %o Contact', data['@rid'].toString(), data.out_Contain.delegate.size);
} else if (data['@rid']) {
logger.info('Segment %s contains %o Contact', data['@rid'].toString(), data);
} else {
logger.info('Data %o', data);
}
})
.on('error', (err) => {
logger.error(err);
})
.on('end', () => {
console.timeEnd('query');
logger.info('End of the stream');
process.emit('SIGINT');
});
logger.debug('Registering SIGINT');
process.once('SIGINT', async () => {
await session.close();
await pool.close();
await orient.stop();
});